2016-01-12 155 views
2

我有做除了一个match.The 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”。

  • 我想增强在上述正则表达式,以便它可以在$字符串赶上“-ABC”,但如果它试图在$字符串“ABC-ABC”匹配“-ABC”它不应该。
+0

什么'/ \ B-ABC \ B /'? –

+0

谢谢......它匹配“-abc”,但它不匹配没有在之前的正则表达式[“/ \ b”。$ wordToMatch。“\ b /”]中加入的连字符“abc”的单词。 –

回答

1

如果您的关键字可以有非单词字符在攻防两端你可以依靠lookarounds一个全字匹配:

"/(?<!\\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! 
+0

谢谢..但这里它也匹配“abc-abc”中的“-abc”。不应该发生。 –

+0

这里,['-abc'在'abc-abc'中不匹配](https://regex101.com/r/yN6fA0/1) –

+0

如果单词$ wordToMatch以连字符开头ie:“ - answer”if $ string包含任何独立词,如“-answer”[不是“问题答案”],它应该显示独立词的匹配。 –

相关问题