У меня есть блок кода, который займет блок текста следующим образом:
Пример текста примера текста http://www.google.com образец текста
- Замена пустого пространства на preg_replace вызывает недопустимые символы с UTF-8
- Regex игнорировать акценты? PHP
- Замена акцентированных символов php
- Вырезание символов, которые не являются a-zA-Z0-9, _ и - из строк PHP
- вырезать многобайтовое пустое пространство из строки PHP
- Регулярное выражение соответствует словам или фразам в строке, но НЕ совпадает с частью URL или внутри тегов <a> </a>. (РНР)
Используя метод 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-адреса, которые уже находятся внутри тега.
Добавьте код в начало шаблона, чтобы захватить открывающий тег привязки, а затем не выполните код обратного вызова, когда он что-то захватил:
/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/
Затем вам нужно добавить функцию if, чтобы узнать, есть ли что-либо в $ match [1] (не забудьте также увеличить ваши захваты)
Вы не можете использовать отрицательный взгляд на утверждение здесь, поскольку захват не является фиксированной длиной, но вы можете использовать отрицательное выражение в ожидании для закрывающего тега, чтобы оно полностью потеряло совпадение:
/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/