Я хочу искать свою строку и заменять некоторые слова ссылкой на какую-то страницу. но у меня проблема с похожими словами типа «Справка» и «Помогите мне». Я хочу связать «Помогите мне», а не «Помощь». это мой код:
$text="Please Help Me Fix This Issue!"; $AllTags=[]; $AllTags[]='Help'; $AllTags[]='Help Me'; $tmp = array(); foreach($AllTags as $term){ $tmp[] = "/($term)/i"; } echo preg_replace($tmp, '<a href="$0">$0</a>', $text);
Вот динамический подход: сортируйте массив по длине значения в порядке убывания, затем implode
с |
в шаблон с чередованием, так что более длинные части будут сопоставлены сначала (помните, что первая ветвь слева, которая соответствует, заставит регулярное выражение останавливать анализ альтернатив, см. « Помните, что механизм регулярных выражений является нетерпеливым» ).
использование
$text="Please Help Me Fix This Issue!"; $AllTags=[]; $AllTags[]='Help'; $AllTags[]='Help Me'; usort($AllTags, function($a, $b) { return strlen($b) - strlen($a); }); echo preg_replace('~' . implode('|', $AllTags) . '~', '<a href="$0">$0</a>', $text);
См. Демо-версию PHP .
Регулярное выражение будет выглядеть как ~Help Me|Help~
. Возможно, вы захотите добавить границы слов ( \b
) ( см. Демонстрацию ) или образы, подобные (?<!\S)
и (?!\S)
( см. Демонстрацию ), чтобы соответствовать только целым словам позже.