编程语言
首页 > 编程语言> > php – 我试图拆分/爆炸/ preg_split一个字符串,但我想保留分隔符

php – 我试图拆分/爆炸/ preg_split一个字符串,但我想保留分隔符

作者:互联网

我试图拆分/爆炸/ preg_split一个字符串,但我想保留分隔符示例:

explode('/block/', '/block/2/page/2/block/3/page/4');

预期结果 :

array('/block/2/page/2', '/block/3/page/4');

不确定我是否必须循环然后重新为数组值添加前缀或者是否有更简洁的方法.

我用PREG_SPLIT_DELIM_CAPTURE尝试了preg_split(),但我得到了以下内容:

array('/block/, 2/page/2', '/block/, 3/page/4');

这不是我想要的.任何帮助深表感谢.

解决方法:

您可以像这样使用preg_match_all

$matches = array();
preg_match_all('/(\/block\/[0-9]+\/page\/[0-9]+)/', '/block/2/page/2/block/3/page/4', $matches);
var_dump( $matches[0]);

输出:

array(2) {
  [0]=>
  string(15) "/block/2/page/2"
  [1]=>
  string(15) "/block/3/page/4"
}

Demo

编辑:This是我用preg_split做的最好的.

$array = preg_split('#(/block/)#', '/block/2/page/2/block/3/page/4', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

$result = array();
for( $i = 0, $count = count( $array); $i < $count; $i += 2)
{
    $result[] = $array[$i] . $array[$i + 1];   
}

如果仍然需要循环以添加分隔符,则使用正则表达式不值得花费.只需使用explode并自己添加分隔符:

$delimiter = '/block/'; $results = array();
foreach( explode( $delimiter, '/block/2/page/2/block/3/page/4') as $entry)
{
    if( !empty( $entry))
    {
        $results[] = $delimiter . $entry;
    }
}

Demo

最终编辑:解决了!以下是使用一个正则表达式,preg_split和PREG_SPLIT_DELIM_CAPTURE的解决方案

$regex = '#(/block/(?:\w+/?)+(?=/block/))#';
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
preg_split( $regex, '/block/2/page/2/block/3/page/4', -1, $flags);
preg_split( $regex, '/block/2/page/2/order/title/sort/asc/block/3/page/4', -1, $flags);

输出:

array(2) {
  [0]=>
  string(15) "/block/2/page/2"
  [1]=>
  string(15) "/block/3/page/4"
}
array(2) {
  [0]=>
  string(36) "/block/2/page/2/order/title/sort/asc"
  [1]=>
  string(15) "/block/3/page/4"
}

Final Demo

标签:php,regex,split,explode,preg-split
来源: https://codeday.me/bug/20190610/1209079.html