urg路由的preg_match_all正则表达式问题

时间:2014-04-28 10:12:40

标签: php regex preg-match-all

我有一个网址路由

Patern:

/^\/stuff\/other-stuff\/(?:([^\/]\+?))$/i

主题:

/stuff/other-stuff/foo-AB123456.html

为什么$ num_matches等于0 ??

$num_matches = preg_match_all($patern, $subject, $matches);

应该非常感谢帮助:)

3 个答案:

答案 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

请注意,这可以通过多种不同方式完成。

以下是有关正则表达式的一些详细信息。

  1. ~分隔符比原始/更好,因为您不必逃避斜杠。
  2. ([\w-.]+)中的括号将网址的结尾捕获到第1组。这就是$m[1]产生foo-AB123456.html
  3. 的原因
  4. 在最后一次斜杠之后,[\w-./]+匹配任意数量的字母或数字,下划线,短划线,圆点和正斜杠。这是一个&#34;迷你规格&#34;对于我们期望的角色。如果你想要任何东西,你可以用一个简单的点。