2012-10-18 5 views
2

하이퍼 링크에 대한 http 링크를 찾아 교체해야합니다. 이러한 http 링크는 span 태그 안에 있습니다.PHP를 대체 할 DomDocument

$ 텍스트에는 html 페이지가 있습니다.

$doc = new DOMDocument(); 
$doc->loadHTML($text); 
foreach($doc->getElementsByTagName('span') as $anchor) { 
    $link = $anchor->nodeValue; 
    if(substr($link, 0, 4) == "http") 
    { 
     $link = "<a href=\"$link\">$link</a>"; 
    } 
    if(substr($link, 0, 3) == "www") 
    { 
     $link = "<a href=\"http://$link\">$link</a>"; 
    }  
    $anchor->nodeValue = $link; 
} 
echo $doc->saveHTML(); 

그것은 확인을 작동합니다 스팬 태그 중 하나는 여기에

<span class="styleonetwo" >http://www.cnn.com/live-event</span> 

내 코드가 같은 것을 가지고있다.

<span class="styleonetwo" > sometexthere http://www.cnn.com/live-event somemoretexthere</span> 

분명히 코드 위에 늘이 상황을 위해 일 : 그러나 ... 나는이 범위 내의 데이터가 같은 경우에도 작업 할. preg_replace를 사용하지 않고 DOMDocument를 사용하여 패턴을 검색하고 바꿀 수있는 방법이 있습니까?

업데이트

:는 preg_replace이다 관한 필의 질문에 대답하려면 :

\b(?:(?:https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$] 

그것은 regexpal에서 제공하는 regextester에 좋은 작품 :

나는 다음과 같은 패턴 매칭을 테스트 regexpal.com을 사용했다. PHP 코드에서 같은 패턴을 사용하면 별난 오류가 발생했습니다. 이스케이프 문자에 대해서도 모르는 수정 자 오류가 있습니다! 다음은 preg_replace에 대한 코드입니다.

$httpRegex = '/\b(\?:(\?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#/%\?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]/'; 
$cleanText = preg_replace($httpRegex, "<a href='$0'>$0</a>", $text); 

나는 "unknown modifiers"에 너무 좌절했고 내 문제를 해결하기 위해 DOMDocument를 추구했습니다.

+0

'preg_replace() '의 문제점은 무엇입니까? – Phil

+0

Phil, 질문을 업데이트했습니다. 감사. – love2code94

+0

정규 표현식이 이스케이프 처리되지 않았습니다. 이스케이프 문자와 구분 기호를 이스케이프 처리해야합니다! – Tivie

답변

2

정규식이이 문제에 잘 맞습니다. preg_replace을 사용하는 것이 좋습니다.

이제는 패턴에 여러 개의 이스케이프 처리되지 않은 delimiters이 있으므로 이스케이프 처리하거나 다른 문자를 구분 기호로 사용할 수 있습니다 (예 : ^). 따라서 올바른 패턴은 다음과 같습니다.

$httpRegex = '^\b(?:(?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#\/%\?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$]^i'; 
+0

감사합니다. Nikita! 도움이됩니다. preg_replace ($ httpRegex, "$0", $ text); 그것은 나에게 "http"없이 링크를 제공합니다. preg_replace ($ httpRegex, "http : // $ 0", $ text)로 코드를 대체 할 수 있습니다. 그러나 텍스트의 링크가'code'http : // something'code '인 경우'code'http : // http : //'code'를 내게 줄 것입니다. 나는'code'와 같은 링크를 가질 수있다. wwww.link.com'code' 또는'code' http://www.link.com'code'. 이 문제를 해결하기 위해 두 개의 정규 표현식을 작성해야합니까? 다시 한번 감사드립니다. – love2code94

+0

'preg_replace_callback' 함수를 사용합니다 - 여기 예제가 있습니다 : http://pastebin.com/GfPjtbku – NikitaBaksalyar

+0

대단히 고마워요! – love2code94