1

好的,所以我有一个 RSS 提要。每篇文章都包含多个 HTML 链接。他们都是同一个主机(例如youtube.com),而不是有一个不同的主机。我正在尝试过滤这个链接。

所以目前,我有一个最常见主机(imgur、减号、tumblr 等)的规则列表,如下所示:

(?i).*?href="(https?://[^"]*host1[^"]*).*
(?i).*?href="(https?://[^"]*host2[^"]*).*
(?i).*?href="(https?://[^"]*host3[^"]*).*

问题是:总是有与未知主机的链接。所以我想要做的是,将主机从所有其他链接(都是相同的)“列入黑名单”。我读过(?!regex)但它似乎不起作用:

(?i).*?href="(https?://[^"]*(?!youtube)[^"]*).*

我希望你能理解我的问题,并为我(可能)糟糕的英语感到抱歉!

4

1 回答 1

0

你似乎想要的是相当于“grep -v”,但也许你不能用 Yahoo Pipes 做到这一点。如果您要使用否定前瞻,您的表达式需要准确定义它正在寻找的位置。

让我们从字符串开头的简单“youtube”开始:

   $ echo youtubexyz | perl -lne  'print $1 if /(?!youtube)^(.+)/'
   $ echo ourtubexyz | perl -lne  'print $1 if /(?!youtube)^(.+)/'
   ourtubexyz

现在让我们创建一个正则表达式,针对您要过滤的一些 URL:

   $ echo www.youtube | perl -lne  'print $1 if /(www\.(?!youtube).+)/'
   $ echo www.ourtube | perl -lne  'print $1 if /(www\.(?!youtube).+)/'
   www.ourtube

您可以继续使您的正则表达式匹配更多网址,但仍排除“youtube”网址:

   $ echo www.youtube | perl -lne  'print $1 if /((?:www|\/\/)\.(?!youtube).+)/'

注意:我使用捕获括号和 'print $1' 来说明匹配的内容。您可能不需要在过滤器中捕获。

于 2013-01-27T20:13:15.660 回答