2011-01-25 116 views
2

我已经在PHP中编写了以下正则表达式以供在preg_replace()中使用。正则表达式等于条件,除了某些条件

/\b\S*(.com|.net|.us|.biz|.org|.info|.xxx|.mx|.ca|.fr|.in|.cn|.hk|.ng|.pr|.ph|.tv|.ru|.ly|.de|.my|.ir)\S*\b/i 

这个正则表达式很有效地从字符串中删除所有URL(虽然我确信我可以写出更好的一个)。我需要能够从特定的域添加排除。因此,伪代码将是这样的:

IF string contains: .com or .net or. biz etc... and does not contain: foo.com THEN execute condition. 

如何做到这一点任何想法?

+1

这不是一个URL。您正在讨论如何匹配主机名,并尝试将其与您所听到的TLD列表进行匹配。这很少是一个好主意,因为TLD列表一直在增长,并且包含了很多您错过的(尽管尚未存在的.xxx)。 – bobince 2011-01-25 21:55:07

+0

如果您将其放入regex.powertoy.org中,它可以很好地工作,但其他顶级域名可以工作。正如我所说,它不是最好的解决方案,但它确实适用于这种情况。 – systematical 2011-01-25 22:10:12

回答

3

只需添加一个negative lookahead assertion

/(?<=\s|^)(?!\S*foo\.com)\S*\.(com|net|us|biz|org|info|xxx|mx|ca|fr|in|cn|hk|ng|pr|ph|tv|ru|ly|de|my|ir)\S*\b/im 

此外,请记住,你需要躲避点 - 那你可以交替外移动它,因为每一种选择的一个点开始。

1

改为使用preg_replace_callback。 让你的回调决定是否替换。

如果要求对于简单的正则表达式来说过于复杂,它可以给予更多的灵活性。