每個人。我正在學校項目上工作,我一直在努力清理使用雅虎管道的飼料中的所有鏈接。正則表達式使用Yahoo管道去除鏈接
例如從我的item.description中刪除<a href="http://mickey.com">Go to Source</a>
。
留下「轉至源」無主用鏈路
我使用正則表達式的模塊,我試圖用這句話
#</?a[^>]*>#iu
但沒有成功。請有人可以幫我解決這個問題。
每個人。我正在學校項目上工作,我一直在努力清理使用雅虎管道的飼料中的所有鏈接。正則表達式使用Yahoo管道去除鏈接
例如從我的item.description中刪除<a href="http://mickey.com">Go to Source</a>
。
留下「轉至源」無主用鏈路
我使用正則表達式的模塊,我試圖用這句話
#</?a[^>]*>#iu
但沒有成功。請有人可以幫我解決這個問題。
HTML至少是一種上下文無關語言。用正則表達式正確解析CFL是不可能的。因此,這是不可能的。使用適當的HTML解析庫,並重新制作DOM樹或偶數流(取決於接口),以便適合您想要做的事情。
從本質上講,你要的是:
<a.*?>(.*?)</a>
這將捕獲$ 1的鏈接文字。 「*?」是一個非貪婪的比賽 - 這意味着這將匹配任何東西,但儘可能少的幾次。
爲了更加安全,您可能需要接受奇的地方和情況選擇一些空間:
<\s*[Aa].*?>(.*?)<\s*/[Aa]\s*>
即使這不是防彈的,但應該處理大多數情況下。
如果您使用「正則表達式」模塊而不是「字符串正則表達式」,請不要忘記g和s選項。
HTML是not a regular language和cannot be matched by regular expressions。你可以把一些可能與HTML相匹配的東西放在一起,並且有時會起作用,但是一旦有些奇怪,就會意外失敗。
現在,可悲的是,雅虎管道似乎沒有包含HTML解析器。但是,根據this blog entry,您可以通過HTML Tidy管道傳輸數據,然後使用它們的Fetch Data模塊,該模塊可以解析XML以提取結構化格式的數據。之後用於處理XML的工具並不理想(它們似乎不支持像XPath或CSS選擇器查詢那樣有用的任何東西),但至少您可以使用已由適當解析的結構化格式處理數據HTML解析器。
試試這個:
$html = 'This is some text <a href="http://mickey.com">Go to Source</a> more text';
$result = preg_replace('%<a[ ]{1}.*?>(.*?)</a>%i', '$1', $html);
echo $result // echo's "This is some text Go to Source more text"
'?a[^>] *>'似乎也爲我工作。當然,它很弱,它也會刪除''等,但它沒有散列。你的問題到底是什麼?你可以發佈管道嗎? – Kobi 2009-12-13 11:29:45