2011-05-28 123 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