2013-09-28 73 views
0

在一個字符串中,我有很多HTML元素,其中一個是應該被解析的輸入。正則表達式PHP PRCE麻煩

<input name="generate" value="52FadA=" type="hidden"> 

我做了正則表達式,但它不起作用。可能是轉義字符,目前還不清楚:(

preg_match_all('/input[\s](?:(?:name\="generate"[\s]value\="(.*)")|(?:value\="(.*)"[\s]name\="generate"))[\s]/i',$html,$matches,PREG_SET_ORDER); 

有什麼不對?

也將是非常感謝的幫助做到這一點更加普遍例如,在屬性的隨機順序的情況。

謝謝,奧列格。

+4

不要使用正則表達式解析HTML,使用HTML解析器來代替。 –

+0

「但它不起作用」不是很有用。 – Toto

回答

2

不要解析HTML與正則表達式。使用DOMDocument::loadHTML($string),然後使用DOM或XPath方法來查詢數據。DOMDocument::loadHTML()將正常解析文檔FR agments。

在您的例子可能是這樣的:

$str = '<input name="generate" value="52FadA=" type="hidden">'; 
$doc = new DOMDocument(); 
$doc->loadHTML($str); 

$value = $doc->getElementsByNodeName('input')->item(0)->getAttribute('value'); 
+0

但是,如果dom結構會發生變化呢? :( – devzorg

+0

如果你正在使用'getElementsByTagName()',這應該不是問題。順便說一句,當DOM改變時,維護正則表達式會更困難。這就是爲什麼它被認爲是不好的做法的原因之一 – hek2mgl

+0

什麼是錯的? $ DOM =新的DOMDocument(5, 'UTF-8'); $ dom-> loadHTMLFile($這個 - > auth_url); $令牌= NULL; $輸入= $ dom->的getElementsByTagName('輸入'); /** @var $ input DOMElement */ foreach($ inputs as $ input){ print_r($ input,true); } – devzorg