正则表达式忽略双引号内的匹配

时间:2014-04-09 13:12:08

标签: php regex

我试图用短语中的一些特殊字符替换空格。但我只是在条件上匹配空间。请查看以下示例以便了解!

我不希望将空格与尾随和前导特殊字符串匹配,例如

  

AND,OR,NOT, -

我的示例字符串

apple google AND bing NOT yahoo

在上面的例子中,我想只匹配 apple google 之间的空格。所以写下面的代码。

$q = 'apple google AND bing NOT yahoo';
$pattern1 = '/(?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR)/';
$replacement1 = ' ## ';
echo $qs = preg_replace($pattern1, $replacement1, $q,-1);

这是输出

  

apple ## google AND bing NOT yahoo

我的问题现在,带引号的字符串。我想忽略引号之间的空格。

  

“apple google”AND bing NOT yahoo =&gt;应该是0匹配

那么如何编写表达式呢?

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

$s = '"apple google" AND bing NOT yahoo "word a-b"';
$r = preg_replace('/(?=(([^"]*"){2})*[^"]*$)(?<!AND|NOT|OR) +(?!-|AND|NOT|OR)/i', 
                  ' ## ', $s);
echo "$r"; // "apple google" AND bing NOT yahoo ## "word a-b"

这假设输入中的引号是平衡的,因为它通过计算前瞻后的引号数来检测引号内的文本。

答案 1 :(得分:1)

这对你有用吗?

(?<!AND|NOT|OR")[ ](?!-|AND|NOT|OR|[a-zA-Z]+")

修改

我有另一个想法,这应该有效:

(?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR|(([a-zA-Z])\s?)+[a-zA-Z]")

编辑2 对于带有连字符的单词

    (?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR|(([a-zA-Z-])\s?)+[a-zA-Z]")

编辑3

请参阅anubhava的答案以获得更好的方法:)