2011-08-19 4 views
1

Я хочу извлечь ссылку href из текста или строки. Я пишу небольшую функцию для этого, но это медленно, когда строка для преобразования является большой. Мой код:PHP-функция для извлечения ссылки из строки

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);/**/ 
} 

Могу ли я сделать это быстро?

ответ

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 
} 
+0

спасибо, что это мне помогло в 2013 году – user1001176

0

Вы, кажется, разбиваете текст на слова, разделенные пробелами, а затем сопоставляя каждое слово с регулярным выражением. Это очень много времени. Более быстрый способ сделать это - выполнить поиск регулярного выражения по всему тексту, а затем повторить его результаты.

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

это нормально, но я хочу вернуть текст, который не содержит ссылки. как это сделать с помощью Regex – wyknzo

+0

Вы можете сделать preg_replace_all ($ regex, "", $ text), который удалит все шаблоны, соответствующие $ regex. Однако это немного опасно, так как он может удалить больше, чем вы рассчитывали. –

+0

спасибо u. ваш ответ поможет мне – wyknzo

Смежные вопросы