引用符で囲まれた文字列を削除してから、残っているものを検索することをお勧めします。
$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.