正则表达式的错误匹配

时间:2010-04-07 07:19:07

标签: php regex joomla preg-match

$regexp = '/(?:<input\stype="hidden"\sname="){1}([a-zA-Z0-9]*)(?:"\svalue="1"\s\/>)/';
$response = '<input type="hidden" name="7d37dddd0eb2c85b8d394ef36b35f54f" value="1" />';
preg_match($regexp, $response, $matches);

echo $matches[1]; // Outputs: 7d37dddd0eb2c85b8d394ef36b35f54f

所以我正在使用这个正则表达式在实现Joomla的网页上搜索身份验证令牌,以便执行脚本登录。

我已经完成了所有这些工作,但我想知道我的正则表达式有什么问题,因为它总是返回2个项目。

Array ( [0] => [1] => 7d37dddd0eb2c85b8d394ef36b35f54f)

此外,我正在检查的输入名称会更改每个页面加载的长度和名称。

2 个答案:

答案 0 :(得分:3)

没有错。 Item [0]始终包含整个匹配。来自the docs(强调我的):

  

如果提供了matches,那么它就是   填写搜索结果。    $matches[0]将包含该文字   匹配完整模式$matches[1]   将有与之匹配的文本   首先捕获括号   子模式,等等。

你的正则表达式(忽略了你正在使用正则表达式处理HTML的事实,你知道你不应该这样做)有点太复杂了。

$regexp = '#<input\s+type="hidden"\s+name="([0-9a-f]*)"\s+value="1"\s*/>#i'
  • 您根本不需要非捕获组。
  • 您使用\s,这会将您限制为单个字符。 \s+可能更好。
  • 使用与/不同的东西作为正则表达式边界,无需在正则表达式中转义正斜杠。
  • 使正则表达式不区分大小写也很有用。
  • 身份验证令牌看起来像十六进制字符串,因此不需要匹配a-z

答案 1 :(得分:0)

根据preg_match的手册条目:

  

如果提供了匹配,那么它将填充搜索结果。 $ matches [0]将包含与完整模式匹配的文本,$ matches [1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。