4

preg_split多亏了尼克,我之前的问题是关于哪个答案超级快的问题;当分隔符在引号内时,我真的很想将场景扩展到不拆分字符串。例如:

如果我有 string foo = bar AND bar=foo OR foobar="foo bar",我希望在每个空格或=字符上拆分字符串,但将=字符包含在返回的数组中(目前效果很好),但我不想拆分字符串中的任何一个分隔符都在引号。

到目前为止我有这个:

<!doctype html>
<?php

$string = 'foo = bar AND bar=foo';

$array = preg_split('/ +|(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

?>
<pre>
<?php

print_r($array);

?>
</pre>

这让我:

Array
(
    [0] => foo
    [1] => =
    [2] => bar
    [3] => AND
    [4] => bar
    [5] => =
    [6] => foo
)

但是,如果我将字符串更改为:

$string = 'foo = bar AND bar=foo OR foobar = "foo bar"';

我真的很希望数组是:

Array
(
    [0] => foo
    [1] => =
    [2] => bar
    [3] => AND
    [4] => bar
    [5] => =
    [6] => foo
    [6] => OR
    [6] => foobar
    [6] => =
    [6] => "foo bar"
)

注意"foo bar"没有在空间上拆分,因为它在引号中?

真的不确定如何在 RegEx 中执行此操作,或者是否有更好的方法,但非常感谢您的所有帮助!

谢谢大家!

4

3 回答 3

6

尝试

$array = preg_split('/(?: +|(=))(?=(?:[^"]*"[^"]*")*[^"]*$)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

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

part 是一个前瞻断言,确保字符串中有偶数个引号字符,因此如果当前位置在引号之间,它将失败:

(?=      # Assert that the following can be matched:
 (?:     # A group containing...
  [^"]*" #  any number of non-quote characters followed by one quote
  [^"]*" #  the same (to ensure an even number of quotes)
 )*      # ...repeated zero or more times,
 [^"]*   # followed by any number of non-quotes
 $       # until the end of the string
)
于 2012-08-08T21:13:36.547 回答
2

我可以通过添加带引号的字符串作为分隔符 a-la 来做到这一点

"(.*?)"| +|(=)

引用的部分将被捕获。看起来这有点脆弱,我没有对它进行广泛的测试,但它至少适用于您的示例。

于 2012-08-08T21:17:24.277 回答
0

但是为什么要拆分呢?

看了这个老问题后,我想到了这个简单的解决方案,使用 apreg_match_all而不是 a preg_split。我们可以使用这个简单的正则表达式来指定我们想要的:

"[^"]*"|\b\w+\b|=

在线演示

于 2014-05-27T02:06:01.033 回答