正则表达式替换字符串中的所有 url 但跳过一个
Regular expression to replace all url from string but skip one
我有正则表达式,它正在从字符串中删除所有 url,但我想更改它并为我的站点 link 添加例外。
$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'
无论什么意思都可以匹配。请注意,这里的 2 个备选方案过于相似 ([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。
我有正则表达式,它正在从字符串中删除所有 url,但我想更改它并为我的站点 link 添加例外。
$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'
无论什么意思都可以匹配。请注意,这里的 2 个备选方案过于相似 ([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。