在PHP中使用正则表达式匹配html属性

时间:2011-05-28 00:04:08

标签: php html regex

我正在尝试创建一个表达式,它将搜索像how2bypass.co.cc这样的页面,并返回“form”标签中“action”属性的内容,以及“name”和“”的内容在任何输入标签中键入“属性”。我不能使用html解析器,因为我的最终目标是自动检测给定页面是否是Web代理,一旦网站抓住我正在做的事情,他们可能会开始做愚蠢的事情,比如写整个使用javascript来阻止我解析它。

我正在使用代码

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

适用于action属性,但是一旦我输入“after type \ =代码停止工作。为什么会这样?它工作正常一次,但不是两次?

2 个答案:

答案 0 :(得分:1)

正则表达式贪婪......

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

`<input.*type\=`

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

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

答案 1 :(得分:0)

如果没有看到要从中提取的目标页面,只需要猜测几件事情:

  • type=属性可能没有双引号,因为type=text也有效。或者它可能有单引号,或=周围的一些空格。
  • 如果代码之间或内部有换行符,.*占位符可能会失败。建议使用/s正则表达式标志。
  • 无论如何,使用[^<>]*[^"]等否定字符类代替.*通常更可靠。
  • 您无需转义\=等号。

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