PHP preg_split有两个分隔符,只捕获一个

PHP preg_split有两个分隔符,只捕获一个

问题描述:

Really poor at regular expressions, sorry in advance!

I've tried my best to work out how to split a string into a array with two delimiters and still capture one and include it in the final array. preg_split seems ideal for this but my regular expression is letting me down.

If for example, I've the string foo = bar AND bar=foo; I want to split the string at either a space, or the = character BUT keep the = so the array would look like:

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

Unfortunately, I'm getting this:

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

I've got here with this code (in PHP):

<!doctype html>
<?php

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

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

?>
<pre>
<?php

print_r($array);

?>
</pre>

I'd really appreciate any help you guys can give, thanks everyone!

正则表达式真的很差,提前抱歉! p>

我是 我尽力研究如何将一个字符串拆分为一个带有两个分隔符的数组,并仍然捕获一个并将其包含在最终数组中。 preg_split code>似乎是理想的,但我的正则表达式让我失望。 p>

例如,如果我有字符串 foo = bar AND bar = FOO 代码>; 我想将字符串拆分为空格或 = code>字符但保留 = code>,以便数组看起来像: p>

  Array 
(
 [0] =&gt; foo 
 [1] =&gt; = 
 [2] =&gt; bar 
 [3] =&gt; AND 
 [4] =  &gt; bar 
 [5] =&gt; = 
 [6] =&gt; foo 
)
  code>  pre> 
 
 

不幸的是,我得到了这个:

  Array 
(
 [0] =&gt; foo 
 [1] =&gt; 
 [2] =&gt; = 
 [3] =&gt;  ; 
 [4] =&gt; bar 
 [5] =&gt; AND 
 [6] =&gt; bar 
 [7] =&gt; = 
 [8] =&gt; foo 
)\  n  code>  pre> 
 
 

我已经使用此代码(在PHP中): p>

 &lt;!doctype html&gt; \  n&lt;?php 
 
 $ string ='foo = bar AND bar = foo'; 
 
 $ array = preg_split('/ + |(=)/',$ string,-1,PREG_SPLIT_DELIM_CAPTURE); \  ñ
&GT;吗?
&LT;预&GT; 
&LT; PHP 
 
print_r($阵列); 
 
&GT;吗?
&LT; /预&GT; 
 代码>  PRE> 
  
 

我非常感谢你们给予的任何帮助,谢谢大家! p> div>

Add the PREG_SPLIT_NO_EMPTY flag:

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

Now, this outputs:

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

Either use PREG_SPLIT_NO_EMPTY to nuke the "empty" matches:

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

Or, change the regex such that it does not produce empty matches:

$array = preg_split('/ +|(?<!\G)(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);