如何将第二次出现的字符与正则表达式匹配?

时间:2012-12-04 16:48:20

标签: php regex

我正在尝试匹配相对网址中的第二个正斜杠。

/dir/entry

我希望与/之后的dir匹配。

3 个答案:

答案 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是完整的匹配,123等等是捕获组的结果(模式中的括号组),你不应该这样做在这里第二个索引对应于匹配。您想要第二个匹配,因此您想要索引1。实际匹配/捕获的字符串的最后一个索引为0,匹配/捕获的偏移量为1

答案 2 :(得分:0)

你想匹配第二个斜线而没有其他东西吗?试试这个:

preg_match('~^/[^/]+\K/~', '/dir/entry');

\KMATCH POINT RESET构造:遇到它时,正则表达式引擎“忘记”到目前为止看到的任何字符,并且当前匹配位置的行为是匹配的开始。例如,如果您想用@替换第二个斜杠,通常会这样做:

preg_replace('~^(/[^/]+)/~', '$1@', '/dir/entry');  # /dir@entry

但如果您处于无法使用捕获组的情况,\K会让您正确:

preg_replace('~^/[^/]+\K/~', '@', '/dir/entry');  # /dir@entry
仅在我知道的Perl和PHP中支持

\K