使用正则表达式用<b>匹配</b>替换搜索词组或搜索词的php代码

时间:2018-07-11 18:14:54

标签: php html regex

我需要基于“火与水”之类的短语来突出显示我的网站内容。我需要在短语<b>周围完全存在的地方加上标签。并且,如果单词单独出现(不是完整的形式),则应该获得<b>标签。例如,如果内容为:

  

世界由火,水和空气三个要素组成。火是热的,水是湿的。

结果应为:

  

世界是由三个元素组成的:“水与火”,“水”和“空气”。 `火``是热的`和````水``是湿的。

我尝试使用:

$output = preg_replace("/("fire and water)/i", '`<b>`$1`</b>`', $content);   
$output = preg_replace("/(fire|and|water)/i", '`<b>`$1`</b>`', $ouput);

但是,当整个短语出现在内容中时,这会产生额外的(和不需要的)<b>标签,从而导致如下结果:

  

` `fire` ```and` ```water` `

我知道这在屏幕上的显示不会和

  

``火与水``

但是,当搜索短语包含'/'时,会引起很大的问题。正则表达式中必须有一种方法可以突出显示完整的短语和单个单词,而不能一次执行。

1 个答案:

答案 0 :(得分:3)

解决方案可能比您想象的简单得多:

$input  = 'The world is made of three elements fire and water and air. Fire is hot and water is wet.';

$output = preg_replace("/(fire and water|fire|and|water)/i", '<b>$1</b>',$input);

echo $output;

输出为:

  

世界由三个元素组成火与水   空气。 炎热 潮湿。

来源如下:

The world is made of three elements <b>fire and water</b> <b>and</b> air. <b>Fire</b> is hot <b>and</b> <b>water</b> is wet.

将按照元素的顺序对其进行处理。

另请参阅:Escaping a forward slash in a regular expression