我正在尝试创建一个表达式,该表达式将在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>
标签。