转义Preg_match中的单词

时间:2014-07-08 07:44:44

标签: php regex preg-replace

我有一个单词列表(在数组中)以字符串($ text)突出显示。这是我的代码

$text = " A string with a spans  and color highlighted";
$words = array('and','span');

    foreach($words as $word){
      $patterns[] = '/'.$word.'/i';
    }

    foreach($words as $word){
      $replacements[] = "<span style='color:red;font-weight:bold;'>".$word."</span>";
    }

echo preg_replace($patterns, $replacements, $text);

我想用$ text替换单词span和color,但结果有所不同,它也取代了html标签范围。我怎样才能克服这个问题。或者我可以替代这个。

您可以在这里重现问题。 http://writecodeonline.com/php/ enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:1)

您不需要为列表中的每个单词生成模式和替换字符串。您只需要构建一个模式和一个带有反向引用的替换字符串:

$text = " A string with a span  and color highlighted";
$words = array('and', 'span');

$pattern = '~\b(?:' . implode('|', $words) . ')\b~';

$replacement  = '<span style="color:red;font-weight:bold;">$0</span>';

$result = preg_replace($pattern, $replacement, $text);

在替换字符串中,反向引用$0指的是整个匹配结果。

由于您只解析字符串一次,因此可以避免此问题。

答案 1 :(得分:0)

这是一个更简单的解决方案,使用explode函数:

$text = "A string with a span and color highlighted";
$words = array('and','span');
$exploded = explode(" ", $text);
$i = 0;
foreach ($exploded as $word) {
    if (in_array($word, $words)) {
        $exploded[$i] = "<span style='color:red;font-weight:bold;'>".$word."</span>";
    }
    $i++;
}
print_r($exploded);

结果:

    Array
(
    [0] => A
    [1] => string
    [2] => with
    [3] => a
    [4] => <span style='color:red;font-weight:bold;'>span</span>
    [5] => <span style='color:red;font-weight:bold;'>and</span>
    [6] => color
    [7] => highlighted
)