2011-10-25 14 views
0

我有一个包含链接的字符串。我希望我的PHP可以根据链接对链接执行不同的操作。使用PHP查找字符串中的链接。与普通和youtube链接不同

答:

所有的
function fixLinks($text) 
{  
     $links = array(); 
     $text = strip_tags($text);  
     $pattern = '!(https?://[^\s]+)!'; 
     if (preg_match_all($pattern, $text, $matches)) { 
      list(, $links) = ($matches); 
     } 

     $i = 0; 
     $links2 = array(); 
     foreach($links AS $link) { 
      if(strpos($link,'youtube.com') !== false) { 
       $search = "!(http://.*youtube\.com.*v=)?([a-zA-Z0-9_-]{11})(&.*)?!"; 
       $youtube = '<a href="youtube.php?id=\\2" class="fancy">http://www.youtube.com/watch?v=\\2</a>'; 
       $link2 = preg_replace($search, $youtube, $link); 
      } else { 
       $link2 = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank"><u>$1</u></a>', $link); 
      } 
      $links2[$i] = $link2; 
      $i++;  
     } 
     $text = str_replace($links, $links2, $text); 
     $text = nl2br($text); 

    return $text; 
} 
+0

'eregei'什么? –

+0

我会更努力,并将更多的正则表达式放在它上面。这通常有助于完全消除视线内任何东西:) - 这有一个回调,所以你可以先提取所有链接,然后寻找youtube:http://stackoverflow.com/questions/6861324/how-to-extract-http -a-paragraph-and-store-them-in-a-array-on-php/6861706#6861706 - 此处为youtube正则表达式:http:// stackoverflow。com/questions/6556559/youtube-api-extract-video-id/6556662#6556662 – hakre

+0

嗯,这只是我发现的一些来的测试。我很乐意提供建议。谢谢 – Holsteinkaa

回答

2

首先,沟eregi。它已被弃用,并将很快消失。

然后,只用一遍就可以做到这一点。我认为你最好分成三个阶段。

阶段1对您的输入运行正则表达式搜索,找到看起来像链接的所有内容,并将其存储在列表中。

阶段2个遍历列表中,检查一个链路是否进入到YouTube(parse_url是此相当有用的),并把合适的替代入第二列表。

阶段3:您现在有两个列表,其中一个包含原始匹配项,一个包含所需替换项。在原始文本上运行str_replace,为搜索参数提供匹配列表,并为替换提供替换列表。

有几个优点这种方法:

  1. 提取链接的正则表达式可以保持相对简单,因为它并没有采取特殊的主机名到
  2. 这是比较容易调试;您可以在第3阶段之前转储搜索并替换阵列,并查看它们是否包含您期望的内容
  3. 由于您一次执行所有替换,因此可以避免重叠匹配或替换一段已替换文本的问题(之后所有替换的文本仍然包含一个URL,并且您不想再替换它)
+0

好吧我设法做到了:-)非常感谢。请评论我的优化代码。 – Holsteinkaa

0

tdammers' answer很好,但另一个选项是使用preg_replace_callback。如果与去,那么过程变化不大:

  1. 创建一个正则表达式匹配的各个环节,同他的第1阶段
  2. 在回调,搜索YouTube视频ID。这将需要运行第二个preg_match,这是(在我看来)这种技术的最大问题。
  3. 根据是否是YouTube返回替换字符串。

的代码会是这个样子:

function replaceem($matches) { 
    $url = $matches[0]; 
    preg_match('~youtube\.com.*v=([\w\-]{11})~', $url, $matches); 
    return isset($matches[0]) ? 
     '<a href="youtube.php?id='.$matches[1].'" class="fancy">'. 
     'http://www.youtube.com/watch?v='.$matches[1].'</a>' : 
     '<a href="'.$url.'" title="Åben link" alt="Åben link" '. 
     'target="_blank">'.$url.'</a>'; 
} 
$text = preg_replace_callback('~(?:f|ht)tps?://[^\s]+~', 'replaceem', $text); 
+0

无法正常工作。 :-( – Holsteinkaa