代码之家  ›  专栏  ›  技术社区  ›  Ballsacian1

与正则表达式的错误匹配

  •  1
  • Ballsacian1  · 技术社区  · 14 年前
    $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的网页上搜索身份验证令牌,以便执行脚本登录。

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

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

    还有我正在检查的输入的名称,每个页面加载的长度和名称都有变化。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Tomalak    14 年前

    没什么不对。项[0]始终包含整个匹配项。从 the docs (强调我的):

    如果 matches 提供了,那么 充满了搜索结果。 $matches[0] 将包含 完全符合模式 , $matches[1] 会有匹配的文本 第一个捕获括号 子模式,等等。

    你的regex(忽略了一个事实,那就是你首先要用regex来处理html,你知道你不应该这样做)有点太复杂了。

    $regexp = '#<input\s+type="hidden"\s+name="([0-9a-f]*)"\s+value="1"\s*/>#i'
    
    • 你根本不需要非捕获组。
    • 你用 \s ,这将限制您使用单个字符。 \s+ 可能更好。
    • 使用不同于 / 因为regex边界使regex中的正斜杠不必转义。
    • 使regex不区分大小写也很有用。
    • auth令牌看起来像一个十六进制字符串,因此匹配 a-z 是不必要的。
        2
  •  0
  •   Joshua Rodgers    14 年前

    按照手动输入 preg_match :

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