我正在使用2202435的解决方案。但是当我在字符串中添加括号时,它不会在数组中给出正确的结果。
$text = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor';
preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);
print_r($matches);
以上代码生成
Array
(
[0] => Array
(
[0] => Lorem
[1] => ipsum
[2] => ("dolor
[3] => sit
[4] => amet")
[5] => consectetur
[6] => "adipiscing \"elit"
[7] => dolor
)
)
但我要找的结果是
Array
(
[0] => Array
(
[0] => Lorem
[1] => ipsum
[2] => (
[3] => "dolor sit amet"
[4] => )
[5] => consectetur
[6] => "adipiscing \"elit"
[7] => dolor
)
)
如果我在'('和'之前''后面加一个空格,我就可以达到上述结果。
请告知正确的正则表达式,这样我就可以保持括号分开(如果可能,请加上解释)。
谢谢。
答案 0 :(得分:0)
原因是你使用的正则表达式是为了在匹配中保持独立"
。
如果您确定未输入未转义的双引号,请使用
'/"(?:\\\\.|[^\\\\"])*"|[^\s"]+/'
^^^^^^
将"
从\S
中排除,将其变为负字符类[^\s]
并在其中添加双引号。
要包含单引号子字符串,您可以使用
'~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~'
请参阅regex demo和PHP demo:
$re = '~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~';
$str = 'Lorem ipsum ("dolor sit amet") consectetur "adipiscing \\"elit" dolor \'something \\\'here\'';
preg_match_all($re, $str, $matches);
print_r($matches[0]);
// => Array ( [0] => Lorem [1] => ipsum [2] => ( [3] => "dolor sit amet" [4] => )
// [5] => consectetur [6] => "adipiscing \"elit" [7] => dolor [8] => 'something \'here' )