Php 正则表达式替换字符串中的所有url,但跳过一个url

Php 正则表达式替换字符串中的所有url,但跳过一个url,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个正则表达式,它正在从字符串中删除所有url,但我想更改它并为我的站点链接添加异常 $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

我有一个正则表达式,它正在从字符串中删除所有url,但我想更改它并为我的站点链接添加异常

$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);

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

'~(?: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}
),它们在可选非捕获组的帮助下被合并为1(
(?:[a-z0-9]+\)

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

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

请参阅。

谢谢您的解释。工作完美。