Regex匹配以连字符开头的单词


Regex to match words starting with hyphen

我有一个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不应该匹配"时。使用上面的正则函数,它无法捕捉到"-aabc"。

  • 我希望在上面的regex中进行增强,这样它就可以在$string中捕获"-abc",但如果它试图匹配$string的"abc-abc"中的"-aabc",它就不应该匹配

如果你的关键词两端都有非单词字符,你可以依靠查找来进行全单词匹配:

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

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

请参阅regex演示,显示-abcabc-abc中不匹配,如果它没有用单词字符括起来,则匹配。

PHP演示:

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