Я бы предложил удалить строки в кавычках, а затем просмотреть то, что осталось.
$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.
person
FrankieTheKneeMan
schedule
25.06.2013
(?<!("|")\s*)WORD(?![\s]*(\"|"))
нет необходимости делать ленивый захват пробела, и ваши термины пробела/кавычки были перевернуты в ретроспективном просмотре. - person FrankieTheKneeMan   schedule 25.06.2013