PHP 正则表达式/定界符

PHP Regex / delimiter

我有一个字符串 "/test:n(0-2)/div/",我想通过正则表达式将其拆分为一个具有函数 preg_split() 的数组。输出应该是这样的:

output = {
[0]=>"test:n(0-2)"
[1]=>"div"
}

然而似乎并没有我想的那么容易。这是我的尝试:https://regex101.com/r/iP2lD8/1

$re = '/\/.*\//';
$str = '/test:n(0-2)/div/';
$subst = '';

$result = preg_replace($re, $subst, $str, 1);

echo "The result of the substitution is ".$result;

Full match 0-17:
/test:n(0-2)/div/

我做错了什么?

只需使用explode():

$result = array_filter(explode('/', $string));

array_filter() 从两端的 / 中移除空瓶。或者你可以 trim() 它:

$result = explode('/', trim($string, '/'));

但要回答这个问题,您只需使用 / 作为 preg_split() 的模式,然后像 /\// 那样转义 / 或使用不同的分隔符:

$result = array_filter(preg_split('#/#', $string));

另一种方式取决于您的需要和字符串内容的复杂性:

preg_match_all('#/([^/]+)#', $string, $result);
print_r($result[1]);

$result[0]是全匹配数组,$result[1]是第一个捕获组()的数组。如果有更多的捕获组,您将在 $result.

中有更多的数组元素

您可以使用

'~/([^/]+)~'

参见regex demo。此模式匹配 /,然后将 /.

以外的 1 个或多个字符捕获到组 1 中

您遇到的问题是尾部斜杠被消耗掉了。还有,你用的是贪心匹配,抢的太多了

Ideone demo:

$re = '~/([^/]+)~'; 
$str = "/test:n(0-2)/div/"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);
// => Array  ( [0] => test:n(0-2) [1] => div  )