使用preg_replace()从字符串中剥离更改的URL

时间:2015-02-26 16:12:38

标签: php regex preg-replace

正如标题所说,但我正在使用的正则表达式有一些小问题。我对正则表达式不太好,你可以看到

我正在尝试删除用户添加到字符串中的所有网址。

但是,由于用户“狡猾”,他们会尝试稍微更改URL,以免触发我的删除代码,因此我的下面的正则表达式也会在略微修改的URL上匹配(因此我没有使用传统的ULR正则表达式)。我知道总是可以欺骗我的删除代码,但我想尽可能地努力

我遇到的问题是,如果用户添加一个句子然后完全停止,但是没有正确的空格,则下面的正则表达式匹配。我想尽可能地限制这一点。

例如以下所有匹配:

this.matches(i 希望此匹配)。

mysite.co.xx(我想要匹配)。

http:// www.mysite.co.xx(我想要匹配)

我试图限制最后一个“。”之后的字符。到2到4之间,但我正在努力解决如何做到这一点。

以下代码就是我正在使用的代码。

define('REG_URL', '@((https?://|https?://\s)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@');

public function stripURLs($string){ 
        try {
            $replacement = "[** website removed **]";
            $string = preg_replace(REG_URL, $replacement, $string);
            return $string;

        }
        catch (Exception  $e){
            error_log('checksubmitted.class.php MLE_Check.stripURls - Exception caught: '.$e->getMessage());            
            return false;
        }   
    }

如果有人能指出我如何做我想做的正确方向,我将非常感激。

如果有人知道这里有任何类似问题(我找不到)或任何其他网站提供删除“狡猾”网址的建议,我将再次感激,如果可以指出这一点。

1 个答案:

答案 0 :(得分:0)

这是我个人对验证网址的偏好:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS