簡體   English   中英

在PHP中需要有關正則表達式的幫助

[英]Need help with regular expressions in PHP

我正在嘗試從共享相同格式的一系列.html內容中索引一些內容。

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

想法是提取數字(18)及其旁邊的文本(blah ...)。 此外,我知道,每個符合條件的行會與開始">和使用END <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。

我能做什么? 我一整天都在苦苦掙扎。

PHP Tidy是您的朋友。 不要使用正則表達式

對於給定的示例和說明,類似/">\\[(.*)\\](.*)(?:<(?:a|\\/p))/似乎可以正常工作,也許添加非捕獲子模式確實可以它?請提供一個反例,其中這不適合您。

雖然我同意RegEx不是解析器,但聽起來你正在尋找的是常規行為字符串的一部分 - 這正是RegEx強大的功能。

如您所見,使用正則表達式來解析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,界面可能看起來更自然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM