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