Php 如何将第二次出现的字符与正则表达式匹配?
我正在尝试匹配相对URL中的第二个正斜杠Php 如何将第二次出现的字符与正则表达式匹配?,php,regex,Php,Regex,我正在尝试匹配相对URL中的第二个正斜杠 /dir/entry 我想匹配/下面的目录如果您试图拆分路径中的目录,将正则表达式保留在工具箱中并使用explode()可能是有意义的 既然/没有什么意义,我想你应该想知道这个位置。您可以使用第四个参数preg\u match\u all: preg_match_all('~/~', $input, $matches, PREG_OFFSET_CAPTURE); $pos = $matches[0][1][1]; 不过,$matches的索引非常糟糕
/dir/entry
我想匹配
/
下面的目录
如果您试图拆分路径中的目录,将正则表达式保留在工具箱中并使用explode()
可能是有意义的
既然
/
没有什么意义,我想你应该想知道这个位置。您可以使用第四个参数preg\u match\u all
:
preg_match_all('~/~', $input, $matches, PREG_OFFSET_CAPTURE);
$pos = $matches[0][1][1];
不过,
$matches
的索引非常糟糕。第一个索引对应于捕获0
是整个匹配,1
、2
、3
等等都是捕获组(模式中的括号集)的结果,而您在这里没有。第二个索引对应于匹配项。您需要第二个匹配项,因此您需要索引1
。最后一个索引是实际匹配/捕获的字符串的0
,匹配/捕获的偏移量的1
。是否要匹配第二个斜杠而不匹配其他内容?试试这个:
preg_match('~^/[^/]+\K/~', '/dir/entry');
\K
是匹配点重置
构造:当遇到它时,正则表达式引擎“忘记”到目前为止看到的任何字符,就像当前匹配位置是匹配的开始一样。例如,如果要将第二个斜杠替换为@
,通常需要执行以下操作:
preg_replace('~^(/[^/]+)/~', '$1@', '/dir/entry'); # /dir@entry
但如果您无法使用捕获组,\K
将使您正确:
preg_replace('~^/[^/]+\K/~', '@', '/dir/entry'); # /dir@entry
\K
仅在我所知的Perl和PHP中受支持。哪种语言?你尝试过什么?你真正想要匹配什么?我正在使用一个PHP驱动的CMS插件。你想实现什么?如果你也通过$3
的$limit
,$parts[2]
将包含第二个/
之后的所有内容。是的,我试图通过使用通过regex查找并替换w/o regex的现有插件来避免编写附加组件或任何php。另外,我需要返回第二个/
,而不是将它们用作分隔符。
preg_replace('~^/[^/]+\K/~', '@', '/dir/entry'); # /dir@entry