php regex preg_replace_callback

时间:2017-10-19 10:55:04

标签: php regex

我有一些继承的代码,其目的是识别字符串中的url,如果它不存在,则将http://协议添加到它们之前。

return preg_replace_callback(
        '/((https?:\/\/)?\w+(\.\w{2,})+[\w?&%=+\/]+)/i',
        function ($match) {
            if (stripos($match[1], 'http://') !== 0 && stripos($match[1], 'https://') !== 0) {
                $match[1] = 'http://' . $match[1];
            }
            return $match[1];
        },
        $string);

它正常工作,除非域名有连字符。因此,例如,以下字符串只能部分工作。

$string = "In front mfever.com/1 middle http://mf-ever.com/2 at the end";

任何正则表达式的天才能看出它有什么问题吗?

2 个答案:

答案 0 :(得分:0)

您只需添加可选的短划线:

((https?:\/\/)?\w+\-?\w+(\.\w{2,})+[\w?&%=+\/]+)

在此处查看工作https://regex101.com/r/Tkdapj/1

答案 1 :(得分:0)

尝试以下正则表达式:

'/((https?:\/\/)?[\w-]+(\.\w{2,})+[\w?&%=+\/]+)/i',

这也包括-DEMO