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