2009-12-13 88 views
2

每個人。我正在學校項目上工作,我一直在努力清理使用雅虎管道的飼料中的所有鏈接。正則表達式使用Yahoo管道去除鏈接

例如從我的item.description中刪除<a href="http://mickey.com">Go to Source</a>

留下「轉至源」無主用鏈路

我使用正則表達式的模塊,我試圖用這句話

#</?a[^>]*>#iu 

但沒有成功。請有人可以幫我解決這個問題。

+0

'] *>'似乎也爲我工作。當然,它很弱,它也會刪除''等,但它沒有散列。你的問題到底是什麼?你可以發佈管道嗎? – Kobi 2009-12-13 11:29:45

回答

0

HTML至少是一種上下文無關語言。用正則表達式正確解析CFL是不可能的。因此,這是不可能的。使用適當的HTML解析庫,並重新制作DOM樹或偶數流(取決於接口),以便適合您想要做的事情。

1

從本質上講,你要的是:

<a.*?>(.*?)</a> 

這將捕獲$ 1的鏈接文字。 「*?」是一個非貪婪的比賽 - 這意味着這將匹配任何東西,但儘可能少的幾次。

爲了更加安全,您可能需要接受奇的地方和情況選擇一些空間:

<\s*[Aa].*?>(.*?)<\s*/[Aa]\s*> 

即使這不是防彈的,但應該處理大多數情況下。

如果您使用「正則表達式」模塊而不是「字符串正則表達式」,請不要忘記g和s選項。

0

HTML是not a regular languagecannot be matched by regular expressions。你可以把一些可能與HTML相匹配的東西放在一起,並且有時會起作用,但是一旦有些奇怪,就會意外失敗。

現在,可悲的是,雅虎管道似乎沒有包含HTML解析器。但是,根據this blog entry,您可以通過HTML Tidy管道傳輸數據,然後使用它們的Fetch Data模塊,該模塊可以解析XML以提取結構化格式的數據。之後用於處理XML的工具並不理想(它們似乎不支持像XPath或CSS選擇器查詢那樣有用的任何東西),但至少您可以使用已由適當解析的結構化格式處理數據HTML解析器。

1

試試這個:

$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"