2015-08-17 60 views
2

我使用這個代碼去除錨標記,並用表達取下錨標記,並使用正則表達式

<ul class="alpha"> 
       <li><h3><a href="http://www.overstock.com/Electronics/Computers-Tablets/473/dept.html?TID=TN:ELEC:Comp">Computers &amp; Tablets</a></h3></li> 
       <li><a href="http://www.overstock.com/Electronics/2-in-1s/28195/subcat.html?TID=TN:ELEC:2in1">2-in-1s</a></li> 
       <li><a href="http://www.overstock.com/Electronics/Laptops/133/subcat.html?TID=TN:ELEC:Lap">Laptops</a></li> 
</ul> 

表達得到的只有內部文本得到呈陣列狀內文是:

echo preg_replace('#<a.*?>([^>]*)</a>#i', '$1', $str); 

輸出是:

Computers & Tablets 
2-in-1s 
Laptops 

我們可以得到錨定標記內的文本陣列形式定期使用體現在哪裏?請分享你的想法。

+0

它是PHP呢?你可以用'DOMDocument'輕鬆做到這一點。 –

+0

而不是'preg_replace'使用'preg_match_all' – anonymous

+1

作爲一般規則:使用DOM解析,而不是正則表達式來解析HTML。 – Alexander

回答

2

好吧,我不喜歡你的工作HTML隨正則表達式,而不是使用的DomDocument但是,如果你想使用正則表達式比你可以使用preg_match_all作爲

preg_match_all('/(?:(<a.*?>))(.*?)(?=<\/a>)/', '<ul class="alpha"> 
       <li><h3><a href="http://www.overstock.com/Electronics/Computers-Tablets/473/dept.html?TID=TN:ELEC:Comp">Computers &amp; Tablets</a></h3></li> 
       <li><a href="http://www.overstock.com/Electronics/2-in-1s/28195/subcat.html?TID=TN:ELEC:2in1">2-in-1s</a></li> 
       <li><a href="http://www.overstock.com/Electronics/Laptops/133/subcat.html?TID=TN:ELEC:Lap">Laptops</a></li> 
</ul>',$res); 
print_r($res[0]); 

輸出:

Array 
(
    [0] => Computers & Tablets 
    [1] => 2-in-1s 
    [2] => Laptops 
) 
+0

解析包含'。*?'的HTML字符串的基於正則表達式的解決方案遠非完美。我相信你會早點回來,尋找一個可靠的,正確的解決方案。僅舉幾個例子:[Bad 1](https://regex101.com/r/vJ2yC6/1),[Bad 2](https://regex101.com/r/vJ2yC6/2)。一旦輸入字符串足夠大,災難性的回溯即將到來。 –

+0

是的,你是對的@stribizhev即使這就是爲什麼我說它不是一個好主意與HTML正則表達式它不是正確的方式來處理HTML解析 –

0

由於您使用jQuery的標籤我寧願做在jQuery的:

var values = []; 
$('.alpha').find('a').each(function(index){ 
    values.push($(this).text()); 
}); 

這段代碼獲得在阿爾法類中的所有鏈接,並推動他們values陣列英寸的values輸出是:

0: "Computers & Tablets" 
1: "2-in-1s" 
2: "Laptops" 
相關問題