PHP会爆炸字符串,但会将引号中的单词视为单个单词并忽略括号

时间:2017-02-15 09:51:46

标签: php regex preg-match-all quotes brackets

我正在使用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
        )

)

如果我在'('和'之前''后面加一个空格,我就可以达到上述结果。

请告知正确的正则表达式,这样我就可以保持括号分开(如果可能,请加上解释)。

谢谢。

1 个答案:

答案 0 :(得分:0)

原因是你使用的正则表达式是为了在匹配中保持独立"

如果您确定未输入未转义的双引号,请使用

'/"(?:\\\\.|[^\\\\"])*"|[^\s"]+/'
                        ^^^^^^

"\S中排除,将其变为负字符类[^\s]并在其中添加双引号。

要包含单引号子字符串,您可以使用

'~"(?:\\\\.|[^\\\\"])*"|\'(?:\\\\.|[^\\\\\'])*\'|[^\s"\']+~'

请参阅regex demoPHP 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' )