2012-08-14 1 views
-2

가능한 중복은 :
Finetune Regex to skip tags
정규식 구문 문제

현재 내 기능은 다음과 같습니다. 일반 텍스트 URL을 HTML 링크로 변환합니다.

function UrlsToLinks($text){ 
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $text); 
} 

그러나 몇 가지 문제가 있습니다. 내가 뭘 하려는지는 태그의 <img> 태그에 기존 링크를 건너 뛰는 것입니다.이 함수에서 무엇을 수정해야하는지 알 수 없습니다.

+0

구문 분석하려는 문자열은 무엇입니까? –

+5

원하는 기능을 정규 표현식을 사용하여 달성하는 것이 불가능하지는 않더라도 어렵지 않습니다. 정규 표현식은 하나도 적지 않습니다. 정말로 HTML 노드의 텍스트 내용 내에서만 링크를 찾는 HTML 파서를 사용해야합니다. – nickb

+4

HTML 파서를 사용하여 텍스트 노드를 추출하고 위의 기능을 통해 * 노드 * 만 실행하면됩니다. HTML 조각을 무시할 수 있도록 수정하여 Tony the Pony의 진노를 없애고 우리는 모두 불타는듯한 깊은 곳에서 태울 것입니다. 그 중 하나 또는 귀하의 응용 프로그램은 불안하고 신뢰할 수없는, 두 중 하나가 될 것입니다. – DaveRandom

답변

1

대체하려는 URL이 아직 태그 안에 없다고 가정하면이 방법을 사용할 수 있습니다.

function UrlsToLinks($text){ 
    $matches = array(); 
    $strippedText = strip_tags($text); 

    preg_match_all('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', $strippedText, $matches); 

    foreach ($matches[0] as $match) {  
     if (filter_var($match, FILTER_VALIDATE_URL)) { 
      $text = str_replace($match, '<a href="'.$match.'" target="_blank">'.$match.'</a>', $text); 
     } 
    } 
    return $text; 
}