gpt4 book ai didi

php - preg_split 有两种模式(其中一种被引用)

转载 作者:搜寻专家 更新时间:2023-10-31 20:46:00 24 4
gpt4 key购买 nike

我想在 PHP 中拆分包含带引号和不带引号的子字符串的字符串。
假设我有以下字符串:

"this is a string" cat dog "cow"  

分割后的数组应该是这样的:

array (  
[0] => "this is a string"
[1] => "cat"
[2] => "dog"
[3] => "cow"
)

我在正则表达式方面遇到了一些困难,我想知道是否有可能只用一个正则表达式/preg_split-Call 来实现...

我首先尝试的是:

[[:blank:]]*(?=(?:[^"]*"[^"]*")*[^"]*$)[[:blank:]]*

但这仅正确拆分了数组[0] 和数组[3] - 其余部分按字符拆分。

然后我找到了这个链接:
PHP preg_split with two delimiters unless a delimiter is within quotes

(?=(?:[^"]*"[^"]*")*[^"]*$)

在我看来,这是一个很好的起点。但是,我示例中的结果与第一个正则表达式的结果相同。

我尝试将两者结合起来——第一个用于带引号的字符串,然后是第二个子正则表达式,它应该省略带引号的字符串(因此是 [^"]):

(?=(?:[^"]*"[^"]*")*[^"]*$)|[[:blank:]]*([^"].*[^"])[[:blank:]]*

因此有 2 个问题:

  1. 仅用一个 regex/preg_split-Call 是否有可能达到我想要的效果?
  2. 如果是,我将不胜感激关于如何正确组装正则表达式的提示

最佳答案

由于匹配不能重叠,您可以像这样使用 preg_match_all:

preg_match_all('/"[^"]*"|\S+/', $input, $matches);

现在 $matches[0] 应该包含您要查找的内容。正则表达式将首先尝试匹配带引号的字符串,然后停止。如果不这样做,它只会收集尽可能多的非空白字符。由于尝试从左到右交替,因此引用的版本优先。

编辑:但这不会去掉引号。为此,您可以使用捕获组:

preg_match_all('/(?|"([^"]*)"|(\S+))/', $input, $matches);

现在 $matches[1] 将准确包含您要查找的内容。 (?| 是为了让两个捕获组都在相同的索引处结束。

编辑 2: 因为您要求的是 preg_split 解决方案,所以这也是可能的。我们可以使用前瞻,断言空格后跟偶数个引号(直到字符串末尾):

$result = preg_split('/\s+(?=(?:[^"]*"[^"]*")*$)/', $input);

当然,这不会去掉引号,但可以在单独的步骤中轻松完成。

关于php - preg_split 有两种模式(其中一种被引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com