正则表达式禁用URL,但只启用一个

时间:2016-12-14 18:11:38

标签: php regex

我需要删除字符串中的所有链接,但请将我网站的网址保留在字符串中。

这是我到目前为止所尝试的:

example.com是我的域名。

(https?:\/\/)?((?:(\w+-)*\w+)\.)+(?:[a-z]{2})(\/?\w?-?=?_?\??&?)+[\.]?(?!example.com)

示例输入包括:

http://website.com
https://www.website.com
http://www.website.com
string http://website.com
http://website.com string
string example.com
string www.example.com
string http://website.com www.example.com
www.website.com example.com

但这不起作用。

1 个答案:

答案 0 :(得分:2)

你做得更简单;现在,你的正则表达式包含许多与你所写的问题无关的组和条件。

简单版本(需要协议)

假设链接包含协议(httphttps),这是一个符合您需要的正则表达式:

/https?:\/\/(?!(www\.)?example\.com)\S+\s*/gi

Demo

这会查找http,可选s://,而不是www.example.comexample.com,然后是一堆非空白字符( \S+)和任何尾随空格(\s*)。只需用空字符串替换任何匹配项。

示例PHP代码(3v4l.org demo):

$re = '/https?:\/\/(?!(www\.)?example\.com)\S+\s*/i';
$str = 'http://foo.com
https://foo.com/bar/baz/?blah=boo&bah=humbug#something
http://google.com/
http://example.com
http://example.com/
https://example.com
https://example.com/
https://example.com/bar/baz/?blah=boo&bah=humbug#something';
$subst = '';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

输出:

The result of the substitution is http://example.com
http://example.com/
https://example.com
https://example.com/
https://example.com/bar/baz/?blah=boo&bah=humbug#something

更复杂的版本(不需要协议)

如果你想删除foo.com(没有协议)的东西,这些东西不是真正的“链接”,你必须更有创意:

/https?:\/\/(?!(www\.)?example\.com)\S+\s*|(?!(www\.)?example.com)\b\w+\.[a-z]{2,}[\/?&=#\S]+\s*/gi

这是regex101 demo3v4l.org demo。第一部分与之前相同,但包含一个替代条款:

(?!(www\.)?example.com)\b\w+\.[a-z]{2,}[\/?&=#\S]+\s*

如果以www.example.comexample.com开头,则忽略后面的内容。然后它尝试匹配单词边界(\b),一串“单词”字符(\w+),句点(\.),两个或多个字母({{1} }),可以跟随域名([a-z]{2,})的任何其他字符,以及任何尾随空格([\/?&=#\S]+)。