Я пытаюсь заменить ссылки url (начиная с http://...) на html гиперссылки в строке с PHP, я использую для этого регулярное выражение, но проблема в том, что существует конфликт с html "& nbsp;". персонажи.
Поэтому я использовал это, похоже, работает с нормальными ссылками, но если я добавлю правило (^&[^;]+?;)
чтобы избежать специальных символов, он не работает.
function shortlink($text) {
return preg_replace_callback(
'/(^|[^"])(((f|ht){1}tps?:\/\/)(^&[^;]+?;)[-a-zA-Z0-9@:;\[\]%_\+.~#!?&\/\/=]+)/i',
'url_link',
$text
);
}
И это функция обратного вызова:
function url_link($match) {
return $match[1].'<a href="'.$match[2].'" target="_blank">'.(strlen($match[2])>50 ? substr($match[2], 0, 24).'<i>'.substr($match[2], 24, 1).'</i><span class="shortl">'.substr($match[2], 25, -19).'</span>'.substr($match[2], -19) : $match[2]).'</a>';
}
Но это:
function shortlink($text) {
return preg_replace_callback(
'/(^|[^"])(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:;\[\]%_\+.~#!?&\/\/=]+)/i',
'url_link',
$text
);
}
Прекрасно работайте, но конфликт все еще существует.
Этот пример иллюстрирует проблему. Если у меня есть строка
http://any_link"e;
это дает =>
<a href="http://any_link'">...
Но я хочу:
<a href="http://any_link">
Любое решение?
Взгляни на:
(f|ht){1}tps
Это будет работать только с защищенными соединениями (httpS
, ftpS
). Он не будет соответствовать http
или ftp
.
(f|ht){1}tps?
, Вопросительный знак делает s
необязательным.
^
(^&[^;]+?;)
означает совпадение начала строки. Если вы поместите это прямо в середину вашего выражения, оно потерпит неудачу. В любом случае, в вашем выражении много избыточности, например,{1}
или экранирование некоторых символов в классе символов и т. Д. Я думаю, что вы хотите взглянуть наhtml_entity_decode()
или взглянуть на этот вопрос . Кстати, GTO - это круто.'/(^|[^"])(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:;\[\]%_\+.~#!?&\/\/=]+)(?:(?!&[^;]+?;).)/i',
но это полностью меняет мое регулярное выражение. Кстати, способ добавить правило без захвата?