我有一个网址路由
Patern:
/^\/stuff\/other-stuff\/(?:([^\/]\+?))$/i
主题:
/stuff/other-stuff/foo-AB123456.html
为什么$ num_matches等于0 ??
$num_matches = preg_match_all($patern, $subject, $matches);
应该非常感谢帮助:)
答案 0 :(得分:0)
因为这个:
[^\/]\+?
首先other-stuff
之后没有斜线,所以你找不到带有否定/
的句子。如果你正在做这种匹配,+
不能被转义。+
只有在进行文字匹配时才能转义^\/stuff\/other-stuff\/(?:(.+?))$
。
纠正的正则表达式应该是:
foo-AB123456.html
演示:http://regex101.com/r/aV9cR0
将匹配第一次捕获中的{{1}}
答案 1 :(得分:0)
$patern= "#^/stuff/other-stuff/([^/]+)$#i";
$subject = "/stuff/other-stuff/foo-AB123456.html";
preg_match_all($patern, $subject, $matches);
print_r($matches[1]);
答案 2 :(得分:0)
在我看来,你的正则表达式可以简化为:
(?i)^/stuff/other-stuff/[\w-.]+$
它会像这样工作:
<?php
$regex="~(?i)^/stuff/other-stuff/([\w-./]+)$~";
$string = "/stuff/other-stuff/foo-AB123456.html";
$hit = preg_match($regex,$string,$m);
echo $m[0]."<br />";
echo $m[1]."<br />";
?>
<强>输出:强>
/stuff/other-stuff/foo-AB123456.html
foo-AB123456.html
请注意,这可以通过多种不同方式完成。
以下是有关正则表达式的一些详细信息。
~
分隔符比原始/
更好,因为您不必逃避斜杠。([\w-.]+)
中的括号将网址的结尾捕获到第1组。这就是$m[1]
产生foo-AB123456.html
[\w-./]+
匹配任意数量的字母或数字,下划线,短划线,圆点和正斜杠。这是一个&#34;迷你规格&#34;对于我们期望的角色。如果你想要任何东西,你可以用一个简单的点。