我正在尝试匹配相对 URL 中的第二个正斜杠。
/dir/entry
我想匹配/
以下dir
.
如果您尝试拆分路径中的目录,则将正则表达式留在工具箱中并使用explode()
.
$parts = explode( '/', $path );
由于 没有任何意义/
,我假设您想找出位置。您可以使用的第四个参数来做到这一点preg_match_all
:
preg_match_all('~/~', $input, $matches, PREG_OFFSET_CAPTURE);
$pos = $matches[0][1][1];
但是,索引$matches
非常可怕。第一个索引对应于捕获。0
是整个匹配,1
等等2
将3
是捕获组(模式内的括号集)的结果,您在这里没有。第二个索引对应于匹配。你想要第二场比赛,所以你想去 index 1
。最后一个索引0
用于实际匹配/捕获的字符串和1
匹配/捕获的偏移量。
你想匹配第二个斜线而不是别的吗?尝试这个:
preg_match('~^/[^/]+\K/~', '/dir/entry');
\K
是MATCH POINT RESET
构造:当遇到它时,正则表达式引擎“忘记”它到目前为止看到的任何字符,并且就像当前匹配位置是匹配的开始一样。例如,如果你想用 替换第二个斜线@
,你通常会这样做:
preg_replace('~^(/[^/]+)/~', '$1@', '/dir/entry'); # /dir@entry
但是,如果您处于无法使用捕获组的情况下,\K
将为您设置正确的:
preg_replace('~^/[^/]+\K/~', '@', '/dir/entry'); # /dir@entry
\K
仅在我所知道的 Perl 和 PHP 中受支持。