Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将第二次出现的字符与正则表达式匹配?_Php_Regex - Fatal编程技术网

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

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的索引非常糟糕

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

/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