2013-08-18 2 views
0

저는 워드 프레스 테마 바닥 글을 해킹하고 있습니다. 조금 문제가 있습니다.PHP DOMDocument - 예기치 않은 종료 태그를 무시합니다.

내가하고있는 일은 부모 테마의 바닥 글을 취하고 출력을 캡처하고 DOMDocument를 사용하여 요소를 수정하는 것입니다.

<?php 
// I apologize in advance for my messy code.... 

/** 
* JavaScript-like HTML DOM Element 
* 
* This class extends PHP's DOMElement to allow 
* users to get and set the innerHTML property of lalalalala.... 
* 
* @author Keyvan Minoukadeh - http://www.keyvan.net - [email protected] 
* @see http://fivefilters.org (the project this was written for) 
*/ 
// blahblahblah 

ob_start(); 
require get_theme_root() . '/responsive/footer.php'; 
$output = ob_get_clean(); 

libxml_use_internal_errors(true); 

$dom = new DOMDocument(); 
$dom->registerNodeClass('DOMElement', 'JSLikeHTMLElement'); 
$dom->loadHTML($output); 
$finder = new DomXPath($dom); 
$classname="powered"; 
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"); 
$elem = $nodes->item(0); 

$elem->innerHTML = "hahaha..gotcha!"; 

echo $dom->saveHTML(); 
?> 

그러나, 바닥 글 출력이 </div>의 (예상치 못한 닫는 태그)를 포함하고 그 DOMDocument를 불평하고있다 : 여기 내 코드입니다. 실제로, 그것은 단지 그 </div>을 제거하고 페이지를 이상하게 보입니다. </div> 주위에 때우는 때문에 그냥 출력의 처음에 </div></div>을 추가 할 수 없습니다.

DOMDocument가 예기치 않은 태그를 무시하고 거기에 두거나 다른 라이브러리를 사용해야하는 방법이 있습니까?

+3

없이 워드 프레스 전문가하지만이 테마 수정 대한 잘못된 접근 방식처럼 보인다. –

+0

@ 대군 절대적으로. [* Child Themes *] (http://codex.wordpress.org/Child_Themes)를 참조하십시오. – Phil

+0

@Phil 이것은 어린이 테마입니다. 꼬리말에 물건을 보관하고 싶지만 업그레이드 할 때 문제가되지는 않습니다. 내 사이트가 현재 무차별 공격을 당하고 있기 때문에 WordPress by Footer의 흔적은 원하지 않습니다. 또한, 나는 개인 정보 보호 정책에 대한 링크와 같이 다른 말을 해달라고 WordPress에 의뢰하고 싶습니다. –

답변

2

해결책을 찾았습니다!

PHP의 DOMDocument 대신 Simple HTML DOM 라이브러리를 사용했습니다. 그 오류에 대해 불평하지 않으며, 심지어 코드의 양을 줄입니다!

<?php 
// Simple HTML DOM Parser 
require (get_stylesheet_directory() . '/core/includes/simple_html_dom.php'); 

ob_start(); 
require (get_theme_root() . '/responsive/footer.php'); 
$outputhtml = str_get_html(ob_get_clean()); 

$outputhtml->find("div.powered", 0)->innertext = "<a href='/privacy-policy'>Privacy</a>"; 

echo $outputhtml; 
?> 
+0

어. 그것이 당신을 위해 작동한다면, 축하해. simple_html_dom에 대한 나의 개인적인 경험은 김이 모여 있다는 것입니다. 개인적으로 사이트에서 제거하고 DOMDocument로 대체해야했습니다. 대규모 메모리 누수가 발생했기 때문입니다. 테스트 할 최신 버전을 다운로드하여 버그가 수정되었는지 확인하고 테스트 스크립트 중 2/3가 실패하거나 완전히 사라지는 지 확인합니다. – cHao

+0

@cHao : simple_html_dom에는 자동 관리 메모리가 없습니다. 당신은 자신을 관리해야합니다. –

+0

@SoroushFalahati : * PHP *는 자동 메모리 관리 기능을 제공합니다. 5.3에는 적절한 가비지 수집기도 포함됩니다. 그러나 simple_html_dom은 어떻게 든 그것을 모두 흩어지게했습니다. – cHao