2011-04-10 2 views

답변

6

HTML 파서는 입력 필터링에 적합하지만 출력을 수정하기 위해서는 단순한 정규식 솔루션의 성능이 필요합니다. 이 경우 콜백 정규식은 다음을 수행합니다.

$html = preg_replace_callback("#<a\s[^>]*href="(http://[^"]+)"[^>]*>#", 
    "cb_ext_url", $html); 

function cb_ext_url($match) { 
    list ($orig, $url) = $match; 
    if (strstr($url, "http://localhost/")) { 
     return $orig; 
    } 
    elseif (strstr($orig, "rel=")) { 
     return $orig; 
    } 
    else { 
     return rtrim($orig, ">") . ' rel="external">'; 
    } 
} 

좀 더 세밀한 검사가 필요할 것입니다. 하지만 이것이 일반적인 접근 방식입니다.

+0

매우 깨끗하고 정확하며 효율적인 솔루션. +1 – ridgerunner

+0

+1 실제로 OP가 원하는 것을하고 있습니다. – Blender

2

SimpleXML과 같은 XML 구문 분석기를 사용하십시오. 정규식은 XML/HTML 구문 분석을 수행하지 않으며, 다음을 수행 할 때 어떤 일이 발생하는지 완벽하게 설명합니다. RegEx match open tags except XHTML self-contained tags.

입력을 XML로 구문 분석하고, 파서를 사용하여 필요한 요소를 선택하고, 파서를 사용하여 속성을 편집 한 다음 다시 추출합니다. 정규식은 나를 울게 만들면서

그것은


여기 이렇게 내 방법입니다 ... 당신에게 두통을 절약 할 수 있습니다 (테스트하지 않았다) :

<?php 

$xmlString = "This is where the HTML of your site should go. Make sure it's valid!"; 

$xml = new SimpleXMLElement($xmlString); 

foreach($xml->getElementsByTagName('a') as $a) 
{ 
    $attributes = $a->attributes(); 

    if (isThisExternal($attributes['href'])) 
    { 
    $a['rel'] = 'external'; 
    } 
} 

echo $xml->asXml(); 

?> 
+0

하지만 정규식을 사용하는 것보다 속도가 느리지는 않습니까? simplexml로 xhtml 구문 분석 예제를 어디에서 찾을 수 있습니까? – Alex

+0

@Alex, 아마도 좋지만. - @Blender, .. 그리고 페이지가 유효한 XML이되도록기도하십시오. – halfdan

+0

정규 표현식으로 이런 일을하는 것은 기본적으로 불가능하기 때문에 Regex는 귀에서 뇌를 폭발시킵니다. 정규식을 사용하여 * 이메일 주소의 유효성을 검사하는 데 필요한 복잡성 수준을 확인하려면 다음을 참조하십시오. http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html – Blender

1

그것은 수도 jQuery를 사용하여 클라이언트 측에서이 같은 일을하는 것이 더 쉬울 수 : 크레이그 화이트로

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $.each($('a'), function(idx, tag) 
     { 
      // you might make this smarter and throw out URLS like 
      // http://www.otherdomain.com/yourdomain.com 
      if ($(tag).attr('href').indexOf('yourdomain.com') < 0) 
      { 
       $(tag).attr('rel', 'external'); 
      } 
     }); 
    }); 
</script> 

그래도 지적이 아무것도 SEO하지 않습니다 JavaScript를 사용하지 않는 사용자에게는 도움이되지 않습니다.

+2

좋은 생각. Google이나 JS가 사용 중지 된 사용자에게는 적합하지 않습니다. –

+0

참. 나는 그것을 반영하기 위해 나의 대답을 업데이트했다. –

관련 문제