我建议删除带引号的字符串,然后搜索剩下的内容。
$noSubs = preg_replace('/(["\']|")(\\\\\1|(?!\1).)*\1/', '', $target);
$n = preg_match_all('/\bWORD\b/', $noSubs, $matches);
我用来替换上面引用的字符串的正则表达式将"e;
,"
和'
作为单独的字符串分隔符。对于任何给定的分隔符,您的正则表达式看起来更像这样:
/"(\\"|[^"])*"/
因此,如果您想将其"
视为等同于"
:
/("|")(\\("|")|(?!")[^"])*("|")/i
如果您还想处理单引号字符串(假设没有带撇号的单词):
/("|")(\\("|")|(?!")[^"])*("|")|'(\\'|[^'])*'/i
转义这些以放入 PHP 字符串时要小心。
编辑
Qtax 提到您可能正在尝试替换匹配的 WORD 数据。在这种情况下,您可以使用如下正则表达式轻松标记字符串:
/("|")(\\("|")|(?!")[^"])*("|")|((?!"|").)+/i
进入带引号的字符串和不带引号的段,然后用您的替换构建一个新字符串,只对不带引号的部分进行操作:
$tokenizer = '/("|")(\\\\("|")|(?!")[^"])*("|")|((?!"|").)+/i';
$hasQuote = '/"|"/i';
$word = '/\bWORD\b/';
$replacement = 'REPLACEMENT';
$n = preg_match_all($tokenizer, $target, $matches, PREG_SET_ORDER);
$newStr = '';
if ($n === false) {
/* Print error Message */
die();
}
foreach($matches as $match){
if(preg_match($hasQuote, $match[0])){
//If it has a quote, it's a quoted string.
$newStr .= $match[0];
} else {
//Otherwise, run the replace.
$newStr .= preg_replace($word, $replacement, $match[0]);
}
}
//Now $newStr has your replaced String. Return it from your function, or print it to
//your page.