我需要一个可以否定一个字符组的模式,并且否定否定组中的一个字符
以下模式有效,但我想多做一些
(?:(?!'\,).)+
这里我不想匹配包含',
的字符串但我真正需要的是在否定小组中整合一个否定 - 就像这样
(?:(?![^\\]'\,).)+
我不想匹配任何转义的引号
匹配:abc',
不匹配:abc\',
argh ..它在输入时发布..
$str = "'abc\',',asdf";
preg_match("/^('(?:(?!',).)+')/", $str, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
这应输出abc\',
但输出abc\
答案 0 :(得分:1)
/^(?:(?!\\\\',).)+$/
似乎可以做你想要的。请注意,您必须转义单引号''
。见http://ideone.com/ypln2
如果您不一定要匹配完整字符串,请删除^
和$
。见http://ideone.com/G67RV
答案 1 :(得分:1)
根据您的上一条评论判断,我认为您正在尝试匹配单引号字符串文字,其中可能包含使用反斜杠转义的单引号。例如,在此字符串中:
'abc\',','xyz'
...您希望匹配'abc\','
和'xyz'
。这很容易:
$source = "'abc\',','xyz'";
print "$source\n\n";
preg_match_all("/'(?:[^'\\\\]++|\\\\.)*+'/", $source, $matches);
print_r($matches);
输出:
'abc\',','xyz'
Array
(
[0] => Array
(
[0] => 'abc\','
[1] => 'xyz'
)
)
<强> see it on ideone 强>
但是也许你想要匹配逗号分隔列表中的所有项目,这些项目可能引用也可能不引用 - 换句话说,CSV(或非常类似的东西)。如果是这种情况,您应该使用专用的CSV处理工具;那里有很多人。实际上,PHP内置了一个:http://php.net/manual/en/function.fgetcsv.php