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

PHP explode the string, but treat words in quotes as a single word and ignore 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
        )

)

如果我在“(”之后和“)”之前包含一个 space,我就能实现上述结果。

请告知正确的正则表达式,这将使我能够将括号分开(如果可能,请提供解释)。

谢谢。

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

如果您确定未转义的双引号在您的输入中始终成对出现,请使用

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

通过将 \S 中的 " 转换为负字符 class [^\s] 并在其中添加双引号来排除 "

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

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

regex demo and a 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' )