我试图用短语中的一些特殊字符替换空格。但我只是在条件上匹配空间。请查看以下示例以便了解!
我不希望将空格与尾随和前导特殊字符串匹配,例如
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匹配
那么如何编写表达式呢?
答案 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的答案以获得更好的方法:)