正则表达式匹配以连字符开头的单词

时间:2016-01-12 13:53:25

标签: php regex

我有一个正则表达式,它执行除一个匹配之外的所有匹配。单词匹配的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”。

  • 我希望在上面的正则表达式中进行增强,以便它可以在$ string中捕获“-abc”,但如果它尝试匹配$ string的“abc-abc”中的“-abc”则不应该。

1 个答案:

答案 0 :(得分:1)

如果你的关键字两端都有非单词字符,你可以依赖于整个单词匹配的外观:

"/(?<!\\w)".$wordToMatch."(?!\\w)/"

在这里,(?<!\w)会确保在要匹配的字词之前没有字符,(?!\w)否定前瞻将确保字后字符匹配。这些是明确的子模式,而\b含义取决于上下文。

请参阅regex demo,表明-abc中的abc-abc不匹配,如果未附加字词,则会匹配。

PHP demo

$wordToMatch = "-abc";
$re = "/(?<!\\w)" . $wordToMatch . "(?!\\w)/"; 
$str = "abc-abc -abc"; 
$subst = "!$0!"; 
$result = preg_replace($re, $subst, $str);
echo $result; // => abc-abc !-abc!