你這樣做更簡單;現在,你的正則表達式包含了許多與你寫的問題無關的組和條件。
簡單的版本(需要協議)
這裏有一個正則表達式,你想要做什麼,假設鏈接包含協議(http
或https
):
/https?:\/\/(?!(www\.)?example\.com)\S+\s*/gi
Demo
這看起來爲http
,可選地s
和://
,之後不是www.example.com
或example.com
,那麼一串非空白cha (\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+
),一個句點(\.
),兩個或多個字母([a-z]{2,}
),可能跟在域名後面的任何其他字符([\/?&=#\S]+
),和任何尾隨的空格(\s*
)。
請輸入和輸出樣品。 – bassxzero