Замените не-html-ссылки тегами <A>

У меня есть блок кода, который займет блок текста следующим образом:

Пример текста примера текста http://www.google.com образец текста

Используя метод preg_replace_callback и следующее регулярное выражение:

 preg_replace_callback('/http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/', create_function( '$matches', '$url = $matches[1]; $anchorText = ( strlen($url) > 35 ? substr($url, 0, 35).\'...\' : $url); return \'<a href="http://\'. $url .\'">\'. $anchorText .\'</a>\';'), $str); 

Преобразует образец текста, чтобы он выглядел так:

Пример текста текста примера <a href = "http://www.google.com"> http://www.google.com </ a> образец текста

Моя проблема заключается в том, что мы внедрили редактор текстовых файлов, который может создавать ссылки перед отправкой в ​​скрипт. Мне нужно обновить этот фрагмент кода, чтобы он игнорировал любые URL-адреса, которые уже находятся внутри тега.

Solutions Collecting From Web of "Замените не-html-ссылки тегами <A>"

Добавьте код в начало шаблона, чтобы захватить открывающий тег привязки, а затем не выполните код обратного вызова, когда он что-то захватил:

 /(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/ 

Затем вам нужно добавить функцию if, чтобы узнать, есть ли что-либо в $ match [1] (не забудьте также увеличить ваши захваты)

Вы не можете использовать отрицательный взгляд на утверждение здесь, поскольку захват не является фиксированной длиной, но вы можете использовать отрицательное выражение в ожидании для закрывающего тега, чтобы оно полностью потеряло совпадение:

 /(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/