我正在尝试创建一个表达式,它将搜索像how2bypass.co.cc这样的页面,并返回“form”标签中“action”属性的内容,以及“name”和“”的内容在任何输入标签中键入“属性”。我不能使用html解析器,因为我的最终目标是自动检测给定页面是否是Web代理,一旦网站抓住我正在做的事情,他们可能会开始做愚蠢的事情,比如写整个使用javascript来阻止我解析它。
我正在使用代码
preg_match_all('/<form.*action\="(.*?)".*>[^<]*<input.*type\=/i', $pageContents, $inputMatches);
适用于action属性,但是一旦我输入“after type \ =代码停止工作。为什么会这样?它工作正常一次,但不是两次?
答案 0 :(得分:1)
正则表达式贪婪......
如果您检查页面源,则以下内容可能与第一个<input
和最后一个type=
匹配,并捕获其中的所有内容。
`<input.*type\=`
您无法使用当前表达式捕获表单和所有输入,因为并非每个输入都以表单标记为前缀。您需要通过以下方式之一来接近它:
<form>...</form>
,然后使用正则表达式匹配捕获中的所有输入.*?
,并允许多次捕获输入标记。答案 1 :(得分:0)
如果没有看到要从中提取的目标页面,只需要猜测几件事情:
type=
属性可能没有双引号,因为type=text
也有效。或者它可能有单引号,或=
周围的一些空格。.*
占位符可能会失败。建议使用/s
正则表达式标志。[^<>]*
或[^"]
等否定字符类代替.*
通常更可靠。\=
等号。也许你应该分开它。使用一个正则表达式来提取<form>..</form>
块。然后在其中搜索<input>
标记。