PHP:Preg_replace,单词边界和非单词字符

时间:2010-11-25 09:49:56

标签: php regex preg-replace

我需要在文本中替换以哈希标记(#)开头的单词。 我知道如何取代整个单词。

preg_replace("/\b".$variable."\b/", $value, $text);

因为\ b修饰符只接受单词字符所以包含哈希标记的单词不会被替换。


我有这个html,其中包含#companyName类型的变量,我将其替换为值。

4 个答案:

答案 0 :(得分:5)

\b匹配字母数字字符(简写\w)和非字母数字字符(\W),将下划线计为字母数字。这意味着,正如您所看到的那样,它在#之前不会匹配(除非前面有一个alnum字符)。

我建议您只使用\b围绕查询词,如果它以alnum字符开头和结尾。

所以,也许这样的事情(虽然我不知道任何PHP,所以这可能在语法上完全错误):

if (preg_match('/^\w/', $variable))
    $variable = '\b'.$variable;
if (preg_match('/\w$/', $variable))
    $variable = $variable.'\b';
preg_replace('/'.$variable.'/', $value, $text);

答案 1 :(得分:1)

所有\ b确实匹配非单词和单词字符之间的变化。既然你知道$ variable以非单词字符开头,你只需要在匹配之前加上一个非单词字符(\ W)。

但是,由于您要更换,要么需要使非单词匹配为零宽度,即后视:

preg_replace("/(?<=\\W)".$variable."\\b/", $value, $text); 

将匹配的字符合并到替换文本中:

preg_replace("/(\\W)".$variable."\\b/", $value, "$1$text");

答案 2 :(得分:1)

以下表达式也可用于标记包含非单词字符的单词的边界: -

 preg_replace("/(^|\s|\W)".$variable."($|\s|\W)/", $value, $text);

答案 3 :(得分:0)

为什么不

preg_replace("/#\b".$variable."\b/", $value, $text);