php函数从字符串中提取链接

时间:2011-08-19 08:02:27

标签: php

我想从文本或字符串中提取href链接。我写一个小函数来做到这一点但是当变换的字符串很大时这很慢。我的代码是

function spy_linkIntoString_Format($text) {
    global $inc_lang; $lang = $inc_lang['tlang_media'];
    $it = explode(' ' ,$text);
    $result = '';
    foreach($it as $jt) {
        $a = trim($jt);
        if(preg_match('/((?:[\w\d]+\:\/\/)?(?:[\w\-\d]+\.)+[\w\-\d]+(?:\/[\w\-\d]+)*(?:\/|\.[\w\-\d]+)?(?:\?[\w\-\d]+\=[\w\-\d]+\&?)?(?:\#[\w\-\d]*)?)/', $jt)) {
            $pros_lis = str_replace('www.','',$jt);
            $pros_lis = (strpos($pros_lis, 'http://') === false ? 'http://'. $pros_lis : $pros_lis);
            $urlregx = parse_url($pros_lis);
            $host_name = (!empty($urlregx['host']) ? $urlregx['host'] : '.com');
            if($host_name == 'youtube.com') {
                $string_v = $urlregx['query']; parse_str($string_v, $outs); $stID = $outs['v'];
                $result .= '<a title="Youtube video" coplay="'.$stID.'" cotype="1" class="media_spy_vr5" href="#"><span class="link_media"></span>'.$lang['vtype_youtube'].'</a> ';
            } elseif($host_name == 'vimeo.com') {
                $path_s = $urlregx['path']; $patplode = explode("/", $path_s); $stID = $patplode[1];
                $result .= '<a title="Vimeo video" coplay="'.$stID.'" cotype="2" class="media_spy_vr5" href="#"><span class="link_media"></span>'.$lang['vtype_vimeo'].'</a> ';
            } elseif($host_name == 'travspy.com') {
                $result .= '<a href="'.$jt.'" title="'.$pros_lis.'" ><span class="jkt_445 jkt_3256 c8_big_corner"></span>'.$pros_lis.'</a> ';
            } else {
                $result .= '<a href="'.$jt.'" title="'.$pros_lis.'" rel="nofollow" target="_blank"><span class="jkt_445 c8_big_corner"></span>'.$pros_lis.'</a> ';
            }
        } else {
            $result .= $jt.' ';
        }
    }
    return trim($result);/**/
}

我可以快速跑吗?

2 个答案:

答案 0 :(得分:5)

您应该重写此内容以使用preg_match_all而不是将文本拆分为单词(即删除explode)。

$regex = '/\b((?:[\w\d]+\:\/\/)?(?:[\w\-\d]+\.)+[\w\-\d]+(?:\/[\w\-\d]+)*(?:\/|\.[\w\-\d]+)?(?:\?[\w\-\d]+\=[\w\-\d]+\&?)?(?:\#[\w\-\d]*)?)\b/';
preg_match_all($regex, $text, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $url = $match[0];
    // your link generator
}

答案 1 :(得分:0)

您似乎将文本分成由空格分隔的单词,然后将每个单词与正则表达式匹配。这确实非常耗时。 更快的方法是对整个文本执行正则表达式搜索,然后迭代它的结果。

preg_match_all($regex, $text, $result, PREG_PATTERN_ORDER);
foreach($result[0] as $jt){
    //do what you normally do with $jt
}