RegEx для замены ссылок, избегая HTML специальных символов

0

Я пытаюсь заменить ссылки 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&quote; 

это дает =>

<a href="http://any_link'">...

Но я хочу:

<a href="http://any_link">

Любое решение?

  • 0
    Конечно, это не работает. ^ (^&[^;]+?;) означает совпадение начала строки. Если вы поместите это прямо в середину вашего выражения, оно потерпит неудачу. В любом случае, в вашем выражении много избыточности, например, {1} или экранирование некоторых символов в классе символов и т. Д. Я думаю, что вы хотите взглянуть на html_entity_decode() или взглянуть на этот вопрос . Кстати, GTO - это круто.
  • 0
    Обратитесь к вашей ссылке, я должен добавить захват в конце регулярного выражения '/(^|[^"])(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:;\[\]%_\+.~#!?&\/\/=]+)(?:(?!&[^;]+?;).)/i', но это полностью меняет мое регулярное выражение. Кстати, способ добавить правило без захвата?
Теги:
hyperlink

1 ответ

0

Взгляни на:

(f|ht){1}tps

Это будет работать только с защищенными соединениями (httpS, ftpS). Он не будет соответствовать http или ftp.

  • 0
    Вам нужно взглянуть еще на один символ (f|ht){1}tps? , Вопросительный знак делает s необязательным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню