2010-11-10 77 views
0

我想索引一系列共享相同格式的.html文件中的一些內容。在PHP中需要正則表達式的幫助

所以我得到了很多的行這樣的:<a href="meh">[18] blah blah blah < a...

這個想法是提取次數(18)和文本旁邊(等等...)。此外,我知道每條排位賽線路將從">開始,並以<a</p結束。該問題源於需要將所有其他htmHTML標籤保留爲文本的一部分(<i><u>等)。

於是我有這樣的事情:

$docString = file_get_contents("http://whatever.com/some.htm"); 
$regex="/\">\ [(.*?)\ ] (<\/a>)(.) *?(<)/"; 
preg_match_all($regex,$docString,$match); 

讓我們來看看$regex爲秒。忽略它的空間,我只是把它們放在這裏,因爲有些人物消失了。我指定它將以">開頭。然後我做[]事情裏面的數字。然後我選出了</a>。到現在爲止還挺好。

最後,我做了一個(.)*?(<)。這是轉折點。通過留下最後一位,(<)就像那樣,當找到下劃線或斜體標記時,文本將被中斷。但是,如果我將(<a|</p)結果數組結束爲空。我試過把它改成只有(<a),但看起來2個人物搞砸了整個TING。

我該怎麼辦?我一整天都在苦苦掙扎。

回答

0

正如您發現的那樣,使用正則表達式來解析HTML並不容易。這是因爲HTML不是特別規則的。

我建議使用XML解析器,例如PHP的DomDocument

創建一個對象,然後使用loadHTMLFile方法打開文件。將a標籤提取爲getElementsByTagName,然後將內容提取爲NodeValue屬性。

它可能看起來像

// Create a DomDocument object 
$html = new DOMDocument(); 

// Load the url's contents into the DOM 
$html->loadHTMLFile("http://whatever.com/some.htm"); 

// make an array to hold the text 
$anchors = array(); 

//Loop through the a tags and store them in an array 
foreach($html->getElementsByTagName('a') as $link) { 
    $anchors[] = $link->nodeValue; 
    } 

一種可以替代的風格的XML/HTML解析器phpquery。他們頁面上的文檔應該很好地解釋如何提取標籤。如果你知道jQuery,界面看起來更自然。

1

/">\[(.*)\](.*)(?:<(?:a|\/p))/之類的東西似乎正常工作,給你的例子和描述。也許增加非捕獲子模式呢?請提供一個反例,其中這不適合你。

雖然我同意RegEx不是解析器,但它聽起來像是你正在尋找的東西是定期表現字符串的一部分 - 這正是RegEx強大的地方。

+0

我會盡快嘗試,只要有機會,謝謝。 – navand 2010-11-12 14:22:57