正则表达式从字符串替换所有url但跳过一个

时间:2017-04-04 16:45:19

标签: php regex preg-replace

我有正则表达式,它正在删除字符串中的所有网址,但我想更改此内容并为我的网站链接添加例外。

$url = 'This is url for example to remove www.somewbsite.com but i want to skip removing this url www.mywebsite.com';  

$no_url = preg_replace("/(https|http|ftp)\:\/\/|([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4})|\?([a-zA-Z0-9]+[\&\=\#a-z]+)/i", "★", $url);

1 个答案:

答案 0 :(得分:0)

首先,由于您要使用硬编码符号替换,并且使用不区分大小写的修饰符,因此可以将正则表达式简化为

'~(?:https?|ftp)://|(?:[a-z0-9]+\.)?[a-z0-9]+\.[a-z]{2,4}|\?[a-z0-9]+[&=#a-z]+~i'

无论匹配意味着什么。请注意,此处的两个备选方案过于相似([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4}),它们在可选的非捕获组((?:[a-z0-9]+\.)?)的帮助下合并为1。

现在,如果您想避免匹配特定模式,可以使用SKIP-FAIL technique:匹配您想要保留的内容并跳过它。

'~www\.mywebsite\.com(*SKIP)(*FAIL)|(?:https?|ftp)://|(?:[a-z0-9]+\.)?[a-z0-9]+\.[a-z]{2,4}|\?[a-z0-9]+[&=#a-z]+~i'

请参阅this regex demo