2009-12-13 72 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"