我有一个正则表达式,它执行除一个匹配之外的所有匹配。单词匹配的PHP代码是:
$string = preg_replace("/\b".$wordToMatch."\b/","<span class='sp_err' style='background-color:yellow;'>".$wordToMatch."</span>",$string);
在上面的正则表达式中,$ wordToMatch变量值变为“-abc”且$ string值为“-abc应该匹配,abc-abc应该匹配”。上面的正则表达式无法捕获“ - ABC”。
答案 0 :(得分:1)
如果你的关键字两端都有非单词字符,你可以依赖于整个单词匹配的外观:
"/(?<!\\w)".$wordToMatch."(?!\\w)/"
在这里,(?<!\w)
会确保在要匹配的字词之前没有字符,(?!\w)
否定前瞻将确保字后字符匹配。这些是明确的子模式,而\b
含义取决于上下文。
请参阅regex demo,表明-abc
中的abc-abc
不匹配,如果未附加字词,则会匹配。
$wordToMatch = "-abc";
$re = "/(?<!\\w)" . $wordToMatch . "(?!\\w)/";
$str = "abc-abc -abc";
$subst = "!$0!";
$result = preg_replace($re, $subst, $str);
echo $result; // => abc-abc !-abc!