将html属性与php中的regex进行匹配


matching html attributes with regex in php

我正在尝试创建一个表达式,该表达式将在how2bypass.co.cc这样的页面中搜索,并返回"form"标记中"action"属性的内容,以及任何输入标记中"name"answers"type"属性的内容。我不能使用html解析器,因为我的最终目标是自动检测给定页面是否是网络代理,一旦网站意识到我在做这件事,他们可能会开始做一些愚蠢的事情,比如用javascript编写整个文档来阻止我解析它

我使用的是代码

    preg_match_all('/<form.*action'="(.*?)".*>[^<]*<input.*type'=/i', $pageContents, $inputMatches);

这对action属性来说很好,但一旦我在type之后加了一个",代码就停止工作了。为什么?它可以工作一次,但不能工作两次?

正则表达式是贪婪的。。。

如果检查页面源,下面可能会匹配第一个<input和最后一个type=,并捕获其间的所有内容。

`<input.*type'=`

您将无法用当前表达式捕获表单和所有输入,因为并非每个输入都以表单标记为前缀。你需要通过以下方式之一来处理它:

  • 捕获整个表单标记<form>...</form>,然后捕获一个正则表达式以匹配捕获中的所有输入
  • 将当前表达式调整为非贪婪.*?,并允许对输入标记进行多次捕获

如果看不到要提取的目标页面,只有几件事可以猜测:

  • type=属性可能没有双引号,因为type=text也是有效的。或者它可能有单引号,或者=周围有一些空白
  • 如果标记之间或标记内部有换行符,.*占位符可能会失败。建议使用/s regex标志
  • 而且通常更可靠的是使用否定字符类,如[^<>]*[^"],而不是.*
  • 您不需要转义'=等号

也许你应该把它分开。使用一个正则表达式提取<form>..</form>块。然后在中搜索<input>标签。