2017-04-04 44 views
2

我的正則表達式這是消除字符串中的所有URL,但我想改變這一點,並添加異常爲我的網站鏈接。正則表達式替換所有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); 

回答

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

+1

謝謝你的解釋。完美的作品。 – R3aSoN