如何在字符的最后一次出现时拆分字符串,以便结果集包含两个值?

时间:2015-09-03 14:40:04

标签: php regex string

我想使用reg_split从斜杠的最后一次出现中分解字符串。

因此输入'/some/string/foo/bar/13'将变为['/some/string/foo/bar', 13]

我知道我可以使用preg_split("/\//", $input);,但这会分成一个大小为6且包含所有字符串的数组。

我也可以像preg_match那样匹配我想要的每个部分:

$match = [];
$value = $page->value;
preg_match("/.*[^\d]/", $value, $match);
$base = $match[0]; // => 13

$match = [];
preg_match("/[^\/]+$/", $value, $match);
$numbers[] = $match[0]; // => /some/string/foo/bar

然而,如何使用preg_split将其转换为oneline?当我尝试应用这些preg_match模式时,我得到一个大小为2的数组,但只有它匹配的值,而不是两者。

4 个答案:

答案 0 :(得分:1)

使用积极的前瞻。

preg_split('~/(?=[^/]*$)~', $input);

否定前瞻。

preg_split('~/(?!.*/)~', $input);

答案 1 :(得分:0)

作为Avi的补充答案,如果你想匹配和捕获(而不是拆分),你也可以使用这样的正则表达式:

(.*/)(.*)

<强> Working demo

Php代码

$re = "@(.*/)(.*)@"; 
$str = "/some/string/foo/bar/13"; 

preg_match_all($re, $str, $matches);

匹配信息

MATCH 1
1.  [0-21]  `/some/string/foo/bar/`
2.  [21-23] `13`

答案 2 :(得分:0)

你也可以这样做:

$str = '/some/string/foo/bar/13';

if (false !== $slashPos = strrpos($str, '/')) {
    $result = [substr($str, 0, $slashPos), substr($str, $slashPos + 1)];
    print_r($result);
}

或:

$parts = explode('/', $str);

$last = array_pop($parts);

$result = [implode('/', $parts), $last];

答案 3 :(得分:0)

不是真正的oneliner,但不需要正则表达式!

$input = '/some/string/foo/bar/13';
$slash_position = strrpos($input, '/');
$result = array(substr($input, 0, $slash_position), substr($input, $slash_position+1));

结果:Array ( [0] => /some/string/foo/bar [1] => 13 )