2012-11-12 87 views
3

我有下面的代碼,我試圖得到解決。使用正則表達式從網站的HTML源代碼提取內容

代碼:

$pageData = file_get_contents('111234-2.html'); 
if(preg_match_all('/<a\s+onclick=["\']([^"\']+)["\']/i', $pageData, $links, PREG_PATTERN_ORDER)) 
    print_r(array_unique($links[1])); 
return false; 

一些樣本HTML,我想它來從:

<a onclick="doShowCHys=1;ShowWindowN(0,'http://www.example.com/home/Player.aspx?lpk4=116031&amp;playChapter=False',960,540,111234);return false;" href="javascript:void(0);"> 
<span class="vt">Welcome 

     </span> 
     <span class="dur">1m 10s</span> 
     <span class="" id="bkmimgview-116031">&nbsp;</span> 
     <br class="clear"> 
    </a> 

輸出我得到:

Array ([0] => doShowCHys=1;ShowWindowN(0,) 

我希望輸出用於:

Array ([0] => doShowCHys=1;ShowWindowN(0,'http://www.example.com/home/Player.aspx?lpk4=116031&amp;playChapter=False',960,540,111234);return false;) 

我該如何做到這一點?

+1

你想匹配什麼? –

+1

此外,您可能會看到一些人對如何不使用正則表達式來解析html進行評論,原因是正則表達式不處理HTML等分層結構。某些html結構可能會混淆你的gegex –

回答

4

您可以使用反向引用來改善這一點,但如果存在更多級別的嵌套引號,您幾乎註定要失敗。

'/<a\s+onclick=(["\'])((?:(?!\1).)+)\1/i' 

反向引用讓您引用已經捕獲的組。因此,如果您在第一次捕獲中捕獲到",那麼您希望找到一串非" s,並且同樣,如果您在第一次捕獲中捕獲了',那麼您希望找到一串非' s ,並且以任何方式分別以相同的報價結束,分別爲"'

編輯:

@vladr提供了好得多的選擇:

'/<a\s+onclick=(["\'])(.*?)\1/i' 

同樣的想法,但非貪婪量詞使得沒有必要測試每一個字符非任何引號岬。更新了Rubular鏈接:http://rubular.com/r/VXR1nQ4zf5

+0

以下是一個Rubular演示:http://rubular.com/r/TAXwfPv0yd。 –

+2

或'/ vladr

+0

@vladr - Oh,very nice。不知道爲什麼我沒有想到這一點。好點。 –

相關問題