2013-01-03 1 views
2

나는 반드시 제어 할 필요가없는 콘텐츠에 대해 preg_replace를 실행 중이며 통화 값 (예 : $1.00)을 포함하는 대체 값 문제가 발생합니다. 틀림없이 이는 다른 질문에서 다루어 진 일반적인 문제입니다. 내가 찾은 가장 가까운 솔루션입니다 : 대체 값이 적어도 내가 볼 수있는 방식으로, 내가 미리 피할 수있는 일이 아니기 때문에대체 값을 이스케이프 처리하는 preg_replace "gotcha"

http://www.procata.com/blog/archives/2005/11/13/two-preg_replace-escaping-gotchas/

내 문제가 더 복잡합니다. 여기 내 레그 코드입니다 :

$body = preg_replace('/<special_tag id="'.$tagID.'">(.*?)<\/special_tag>/','$1',$body); 

당신은 내가 설정 한 사용자 정의 태그 내의 모든 컨텐츠를 캡처하고, 주변의 여는 태그와 닫는 태그를 제거하지만, 내부에있는 내용을 유지하고있어 볼 수 있듯이. 그러나 대체품 '$1'은 필수 이스케이프에 적합하지 않으므로 대체 값에있는 통화 값이 잘못 종료됩니다.

이 대체품을 생각해 봤나요? 특정 태그에 대한 고유 ID를 고려해야한다는 것을 명심하면서 내 특수 태그를 제거하는 데 사용할 수있는 다른 것이 있습니까?

도움이 될 것입니다.

+3

과 같이 발생합니다 "다른 뭔가가 있나요 내 특수 태그를 제거하는 데 사용할 수 있습니다. "uuuh, [DOM 파서는 어떨까요?] (http://stackoverflow.com/questions/3577641/best-met hods-to-parse-html/3577662 # 3577662)? – Gordon

+0

동일한 스크립트의 다른 부분에서이 메서드를 실제로 사용했지만이 대체 알고리즘에서는 과도한 것처럼 보였습니다. 가능한 경우 오버 헤드를 낮추기 위해 노력했지만이 옵션 만있는 경우에는 다시 사용합니다. – oucil

+0

그것은 * 유일한 * 옵션이 아니지만 Regex로 접근하기 전에 (내) 마음에 온다. – Gordon

답변

1

"gotchas"가 없어야하는 가능한 DOM 솔루션.

이 HTML 가정 :

$html = <<< HTML 
<html> 
    <body> 
     <special_tag id="foo"> 
      <p>Some content</p> 
      <p>Some more content</p> 
     </special_tag> 
    </body> 
</html> 
HTML; 

을 당신은 special_tag의 아이들을 위로 당겨 이후 special_tag을 제거 :

// create DOMDocument, suppress parsing errors 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($html); 
libxml_clear_errors(); 

// get special_tag with id foo 
$xpath = new DOMXPath($dom); 
$foo = $xpath->query('//special_tag[@id="foo"]')->item(0); 

// move all children before special_tag 
while ($foo->childNodes->length > 0) { 
    $foo->parentNode->insertBefore($foo->childNodes->item(0)); 
} 

// remove now empty special_tag 
$foo->parentNode->removeChild($foo); 

// output 
echo $dom->saveHTML($dom->documentElement); 

<html><body> 
    <p>Some content</p> 
     <p>Some more content</p> 
    </body></html> 
+0

샘플 코드를 사용해 주셔서 감사합니다. 다른 사람들도 감사하게 생각합니다. 또한 preg 기능을 사용하는 것보다 DOM을 사용하는 것이 훨씬 더 똑똑한 방법 일 것입니다. 건배! – oucil

0

정규식을 사용하여 XML/HTML을 구문 분석하지 않는 것이 좋습니다. 대신 DOM 파서를 사용하십시오.

관련 문제