2011-05-28 132 views
4

我试图制作一个表达式来搜索how2bypass.co.cc这样的页面,并返回“form”标签中“action”属性的内容,以及内容任何输入标签中的“名称”和“类型”属性。我无法使用html解析器,因为我的最终目标是自动检测给定页面是否是Web代理,并且一旦网站发现我正在做这些事情,他们可能会开始做一些愚蠢的事情,比如编写整个JavaScript文件阻止我解析它。在php中使用正则表达式匹配html属性

我正在使用的代码

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

这为action属性工作正常,但一旦我把“后键入\ =代码停止工作。这是为什么?它工作正常一次,但不是两次

回答

0

没有看到,你想从,提取目标页面,只有几件事情来猜测:

  • type=属性可能没有双引号,如type=text也是有效的。或者它可能会有单引号,或者在=附近有空格。
  • 如果标记之间或标记内存在换行符,.*占位符可能会失败。建议使用/s正则表达式标志。
  • 反正使用否定字符类如[^<>]*[^"]而不是.*通常更可靠。
  • 你不需要转义\=等号。

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

1

正则表达式是贪婪...

如果您检查网页的源文件,以下是可能与最后type=匹配第一<input,以及两者之间的一切捕获。

`<input.*type\=` 

你不会是能够捕捉的形式,并与当前的表达式的输入,因为不是每个输入与形式的标记前缀。你需要接近它的下列方式之一:

  • 捕捉整个形式标记,<form>...</form>,然后一个正则表达式中捕获
  • 调整当前的表现是非贪婪所有的输入匹配, .*?,并允许多次捕获输入标记。
+0

谢谢,我没有意识到。*会这样做。但是,我原来的问题依然存在。把报价打破表达,我不明白为什么。 澄清:为什么 \t / 2011-05-28 02:05:45