2010-05-26 78 views
1

我試圖用正則表達式如下:正則表達式打破新線

preg_match_all('|<table.*</table>|',$html,$matches, PREG_SET_ORDER); 

但是這是行不通的,我覺得這個問題是字符串$html內的新生產線。
有人能告訴我一個解決辦法嗎?


編輯:我意識到它是不正確的使用正則表達式來解析HTML。感謝那些告訴我的人。 :)

+4

's'修改,但你不應該使用正則表達式來解析HTML – SilentGhost 2010-05-26 15:21:20

+0

有人解析HTML與正則表達式。 ..你知道該怎麼做 – 2010-05-26 15:23:54

+0

@SilentGhost thanx。你能告訴我用正則表達式解析html有什麼問題嗎? – shyam 2010-05-26 15:34:27

回答

1
preg_match_all('|<table.*?</table>|ms',$html,$matches, PREG_SET_ORDER); 
3

在作出下一步該怎麼做決定,我會讀這第一:http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

一般來說,它不是解析HTML與正則表達式是個好主意。

我建議使用DOM

您可以檢查出PHP Simple HTML DOM Parser作爲替代。

主要特點:

  • 一個HTML DOM解析器寫在PHP5 +讓你在一個非常簡單的方法操作HTML!
  • 需要PHP 5+。
  • 支持無效的HTML。
  • 像jQuery一樣用選擇器在HTML頁面上查找標籤。
  • 從一行中提取HTML中的內容。
1

你試過多行修改器m

preg_match_all('|<table.*</table>|m',$html,$matches, PREG_SET_ORDER); 
3

點不匹配換行符,除非使用s pattern modifier

preg_match_all('|<table.*?</table>|s',$html,$matches, PREG_SET_ORDER); 

(請注意,使用正則表達式來解析HTML排名是SO中最糟糕的資本罪之一)。

0

使用/ s標誌具有'。'也適用於換行符,或者只是顯式檢查換行符 - 通常是'[\ n \ r]'。我還沒有讀它自己,但不要在http://www.pcre.org/pcre.txt

仔細簽出更多的信息在PCRE庫你怎麼雖然形成你的模式 - 與誤解的圖案混合換行符長的輸入字符串可引起原因不明的腳本失敗和連接重置。

就你而言,PCRE函數在這裏似乎並不需要,並且可能會導致意外的結果。如果你只是希望在頁面上提取單個表的內容,爲什麼不只是做最基本的...

 
$start = stripos($input, "<table>"); 
$end = stripos($input, "</table>", $start); 
$my_table = substr($input, $start, $end); 
0

編輯:我意識到,這是不對的使用正則表達式來解析HTML。

更好:你可以閱讀$html成SimpleXML對象,並用SimpleXML的Xpath解析它。 (強大和更容易使用比DOM擴展恕我直言使用。)

像這樣:

$html = "<html><body><table id=\"mytbl\"><tr><td>ABC</td></tr><tr><td>DEF</td></tr></table></body></html>"; 

$xml = simplexml_load_string($html); 

if($xml) 
foreach($xml->xpath("/html/body/*") as $item) { 
    echo $item["id"] . "<br>"; // mytbl 
    foreach($item->tr as $tr) { 
     echo $tr->td . "<br>"; // 1:ABC, 2:DEF 
    } 
}