2011-10-25 7 views
0

링크가 포함 된 문자열이 있습니다. 나는 나의 링크가 URL에 따라 다른 것들을 수행하도록 PHP를 원한다.PHP에서 문자열로 된 링크를 찾습니다. 일반 및 유튜브 링크와 다름

답 : 모든

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 -links-a-paragraph-and-store-them-in-a-array-on-php/6861706 # 6861706 - 여기 youtube regex : http : // stackoverflow.co.kr/questions/6556559/youtube-api-extract-video-id/6556662 # 6556662 – hakre

+0

글쎄, 내가 찾은 일부 테스트 일뿐입니다. 나는 제안을 위해 열려 있습니다. 고마워요 – Holsteinkaa

답변

2

첫째, eregi 도랑. 더 이상 사용되지 않으며 곧 사라질 것입니다.

그런 다음 한 번에이 작업을 수행하는 것이 너무 길어질 수 있습니다. 나는 이것을 세 단계로 나누는 것이 더 나을 것이라고 생각합니다.

단계 1은 입력에 대해 정규식 검색을 실행하고 링크처럼 보이는 모든 것을 찾고 목록에 저장합니다.

단계 링크 무비로 진행 여부를 확인하는리스트 위에 2 반복을하고, 두 번째 목록에 적절한 교체를 가하고 (parse_url이 대단히 유용하다).

단계 3 : 이제 원래 일치 항목 1 개와 원하는 대체 항목 2 개가 있습니다. 원래 텍스트 위에 str_replace를 실행하여 검색 매개 변수의 일치 목록과 대체 항목의 대체 목록을 제공하십시오.

이 계정에 특정 호스트 이름을 필요가 없기 때문에 링크를 추출하기위한 정규 표현식은 비교적 간단 유지 될 수
  1. 그것은 디버깅하기 쉽습니다 :

    이 방법 몇 가지 장점이 있습니다 ; 검색을 덤프하고 3 단계 이전에 배열을 교체하고 예상 한 내용이 포함되어 있는지 확인하십시오.

  2. 모든 교체 작업을 한 번에 수행하기 때문에 일치 항목이 겹치거나 이미 대체 된 텍스트를 바꿀 필요가 없습니다 (이후 모두 대체 된 텍스트에는 여전히 URL이 포함되어 있으므로 다시 교체하지 않으려합니다.)
+0

알았어. 나는 그 일을 처리했다 :-) 대단히 감사합니다. pls 최적화를위한 내 코드에 대한 의견. – 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