2017-02-07 18 views
2

Я хочу найти свою строку и заменить некоторые слова ссылкой на какую-то страницу. , но у меня проблема с похожими словами типа «Помощь» и «Помогите мне». Я хочу связать «Помогите мне», а не «Помощь». это мой код:с выпуском preg_replace и схожие слова в php

$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); 
+0

Если вы хотите связать «Помогите мне», тогда не включайте «Справка» в свой массив 'AllTags'. –

+1

Вы строите шаблон динамически? Или во время разработки? См. Http://ideone.com/Xyb7v2 –

+1

Не используйте массив с 'preg_replace', потому что он обрабатывает всю строку один раз за элемент (с изменениями предыдущих замен). Для этого вы можете: 1) сортировать найденные элементы по размеру строки (от большого до малого). 2) создайте шаблон с чередованием, включающим все отсортированные элементы (используйте 'implode ('|', $ AllTags)'). 3) Обработайте свою строку за один проход с помощью 'preg_replace' с помощью этого шаблона. –

ответ

2

Вот динамический подход: сортируют массив по длине значения в порядке убывания, а затем implode с | в основе рисунок чередования так, что более длинные участки будут сопоставляться первым (помните, что первая ветвь слева, которая соответствует совпадению, заставит регулярное выражение останавливать анализ альтернатив, см. Remember That The Regex Engine Is Eager).

Использование

$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 demo.

Регулярное выражение будет выглядеть как ~Help Me|Help~. Возможно, вы захотите добавить границы слов (\b) (see demo) или искать похожие (?<!\S) и (?!\S) (see demo), чтобы соответствовать только целым слоям.

+1

Вместо использования 'usort' вы также можете сделать это с помощью:' rsort ($ AllTags, SORT_FLAG_CASE | SORT_STRING); ' –

+0

@CasimiretHippolyte: Да, похоже на' 'rsort' '(http://php.net/manual /en/function.rsort.php) тоже будет работать. –

+0

@ WiktorStribiżew Спасибо за вашу помощь. Это решение исправило мою проблему. –