preg_replace для исключения </a> PHP - PullRequest
0 голосов
/ 20 ноября 2018

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

$newstring2 = preg_replace("/\p{L}*?".preg_quote($match[$i])."\p{L}*/ui", "<a href='".$url."' class='link'>$0</a>", $newstring);

Единственная проблема в том, что мне нужно исключить любые ключевые словавнутри <a href='https://keyword.cz' title="keyword">keyword</a>

Это то, что я нашел https://stackoverflow.com/a/22821650/4928816

Итак, кто-то, кто может помочь мне объединить эти два регулярных выражения?

Пример:

$text = 'this is sample text about something what is text.'
$keyword = 'text'

Теперь, благодаря моему регулярному выражению, я получаю:

$text= 'this is sample <a href='somelink.php'>text</a> about something what is <a href='somelink.php'>text</a>.'

Но если текст такой:

$text= 'this is sample <a href='text.php'>text</a> about something what is <a href='somelink.php'>text</a>.'

Эточто например я получаю:

$text= 'this is sample <a href='<a href='somelink.php'>text.php</a>'><a href='somelink.php'>text</a></a> about something what is <a href='somelink.php'><a href='somelink.php'>text</a></a>.'

Обновление: зачем мне это.Работает над функцией замены всех ключевых слов с определенным URL в конкретном сообщении в блоге, полном тегов. Например, если

$keyword = 'key';

, мне нужно найти и заменить полный мир тегом href, например: Ключ, ключевое слово, ключевое слово, keylock, mykey, keys или также KeY, ключевое слово с поддержкой UNICODE

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Если это нужно сделать с помощью регулярных выражений, я думаю, глаголы PCRE - ваш лучший вариант.Исключите все ссылки, затем найдите термин с границами слова.

<a[\S\s]+?<\/a>(*SKIP)(*FAIL)|\bTERM\b

Демонстрация: https://regex101.com/r/KlE1kc/1/

пример ошибки с этим, хотя, если a когда-либо имел </a> в нем.например, onclick='write("</a>")' парсер действительно лучший подход.Есть много ошибок с HTML и регулярными выражениями.

0 голосов
/ 20 ноября 2018

Как насчет этого с негативным взглядом. Regex

Объяснение : захватить все ключевые слова, которые называются text, и заменить на них некоторую ссылку, но не захватить эти ключевые словакоторые имеют </a> после него.

$re = '/(text)(?!<\/a>)/m';
$str = 'this is sample text about something what is text.

this is sample <a href=\'somelink.php\'>text</a> about something what is <a href=\'somelink.php\'>text</a>.';
$subst = '<a href=\'somelink.php\'>$1</a>';

$result = preg_replace($re, $subst, $str);

echo $result;

Вывод:

this is sample <a href='somelink.php'>text</a> about something what is <a href='somelink.php'>text</a>. 

this is sample <a href='somelink.php'>text</a> about something what is <a href='somelink.php'>text</a>.

DEMO: https://3v4l.org/DVTB1

...