我需要删除字符串中的所有链接,但请将我网站的网址保留在字符串中。
这是我到目前为止所尝试的:
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
但这不起作用。
答案 0 :(得分:2)
你做得更简单;现在,你的正则表达式包含许多与你所写的问题无关的组和条件。
假设链接包含协议(http
或https
),这是一个符合您需要的正则表达式:
/https?:\/\/(?!(www\.)?example\.com)\S+\s*/gi
这会查找http
,可选s
和://
,而不是www.example.com
或example.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 demo和3v4l.org demo。第一部分与之前相同,但包含一个替代条款:
(?!(www\.)?example.com)\b\w+\.[a-z]{2,}[\/?&=#\S]+\s*
如果以www.example.com
或example.com
开头,则忽略后面的内容。然后它尝试匹配单词边界(\b
),一串“单词”字符(\w+
),句点(\.
),两个或多个字母({{1} }),可以跟随域名([a-z]{2,}
)的任何其他字符,以及任何尾随空格([\/?&=#\S]+
)。