Элемент пропуска регулярного выражения PHP - PullRequest
1 голос
/ 16 августа 2010

Я написал регулярное выражение, которое преобразует текстовые ссылки в интерактивные ссылки. Код работает нормально, однако, когда HTML-тег передается, он портит код

Вот мой код

$text = preg_replace('#(?<![">])((http|ftp)s?://[^<>\s]+)#i', '<a href="\\0">\\0</a>', $text );

Предполагается пропустить следующий элемент

<a href="http://www.yahoo.com">Yahoo</a>

но это не так .. что я делаю не так?

Спасибо

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Это пропустить." перед URL-адресом, поэтому отрицательный взгляд делает его несовпадающим.

В любом случае, чтобы сделать это надежно, вам следует использовать анализатор HTML.Вы можете преобразовывать только текстовые узлы, не беспокоясь о существующих элементах HTML.

0 голосов
/ 16 августа 2010

После проверки вашего кода с двумя входами:

$text1 = '<a href="http://www.yahoo.com">Yahoo</a>';
$text2 = 'text text http://www.yahoo.com text';

$reg = '{
         (?<![">])
         (
           (?:http|ftp)s? : // [^<>\s]+
         )
        }ix';

echo  preg_replace($reg, '<A HREF="\1">\1</A>', $text1 ) . "\n";
echo  preg_replace($reg, '<A HREF="\1">\1</A>', $text2 ) . "\n";

и чтение соответствующих выходных данных:

=> #1 not touched  <a href="http://www.yahoo.com">Yahoo</a>
=> #2 modified     text text <A HREF="http://www.yahoo.com">http://www.yahoo.com</A> text

Я бы спросил тебя, что ты думаешь, что должно отличаться?

Привет

БВУ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...