在字符串中查找多个URL。

时间:2011-07-29 20:06:57

标签: php regex string

 $resource = "THIS IS ABOUT WWW.JONAKCOMPUTERS.COM, HTTP://HIGHLOW.COM, AND TESTINGSERVER1.COM"

我想把这三个网址拉成另一个类似于:

的字符串
 $all_urls = "JONAKCOMPUTERS.COM - HIGHLOW.COM - TESTSERVER1.COM

我是由其他人发现的:

$pattern = '#(www\.|https?:\/\/){1}[a-zA-Z0-9]{2,}\.[a-zA-Z0-9]{2,}(\S*)#i';
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

但它不会仅仅将“jonakcomputers.com”拉为“http:// url”或“www.url”

对不起,我只是想清楚它最后不区分大小写。我可以随时把它弄清楚。我需要在页面加载之前执行此操作,因此它可能是javascript或php。

如果我能拔出一个,我想我可以做一个循环来继续检查新的,直到它耗尽。

感谢愿意帮忙的人。

3 个答案:

答案 0 :(得分:2)

我在控制台中运行您的代码,只调整最后一个代码段中的变量名称,以便:

php > $resource = "THIS IS ABOUT WWW.JONAKCOMPUTERS.COM, HTTP://HIGHLOW.COM, AND TESTINGSERVER1.COM"
php > $pattern = '#(www\.|https?:\/\/){1}[a-zA-Z0-9]{2,}\.[a-zA-Z0-9]{2,}(\S*)#i';
php > preg_match_all($pattern, $resource, $matches, PREG_PATTERN_ORDER);
php > var_dump($matches);
array(3) {
    [0]=>
        array(2) {
            [0]=>
                string(23) "WWW.JONAKCOMPUTERS.COM,"
            [1]=>
                string(19) "HTTP://HIGHLOW.COM,"
        }
    [1]=>
        array(2) {
            [0]=>
                string(4) "WWW."
            [1]=>
                string(7) "HTTP://"
        }
    [2]=>
        array(2) {
            [0]=>
                string(1) ","
            [1]=>
                string(1) ","
        }
}

你在preg_match返回中看到的是一个带有以下内容的多维数组:

0:完全匹配

1:SubPattern 1匹配

2:SubPattern 2匹配

我看到的唯一解决方案是你需要稍微调整一下RegExp以解决缺少ww或http的问题。所以只需将它用于模式:

$pattern = '#(www\.|https?:\/\/)?[a-zA-Z0-9]{2,}\.[a-zA-Z0-9]{2,}(\S*)#i';

并且您的$匹配现在应该包含全部3个。

答案 1 :(得分:0)

目前的正则表达式完全依赖于初始的www或http来查找网址。如果你想抓住那些不完整的网址,你首先需要定义你想要的东西。

例如,您只是在寻找以.com结尾的内容,还是需要获取“jonakcomputers.br”?

答案 2 :(得分:0)

我想为讨论做出贡献,因为它帮助我找到了这个解决方案。其他可能像我一样运行相同谷歌查询的人可能会遇到同样的问题。

我需要一段正则表达式代码来遍历文本中的每个url,清理它并用css类标记它(对于jQuery版本的嵌入)

此函数接收文本,迭代它找到的每个URL(使用Kai发布的RegExp)

function find_urls($text)
{
    $ret = '';
    // The Regular Expression filter
    $pattern = '#(www\.|https?:\/\/)?[a-zA-Z0-9]{2,}\.[a-zA-Z0-9]{2,}(\S*)#i';

    preg_match_all($pattern, $text, $matches);
    if (sizeof($matches) > 0)
    {
    foreach($matches[0] as $match)
        {
            if(strrpos($match,'http://') === false)
            {
                $url = '<a class="embedly" target="_blank" href="http://'.$match.'">'.$match.'</a> ';

            }
            else
            {
            $url = '<a class="embedly" target="_blank" href="'.$match.'">'.$match.'</a> ';
            }
            $text = str_replace($match,$url,$text);
        }
    }
    return $text;
}