2010-06-03 8 views
1

예 : 특정 클래스가있는 HTML 태그의 콘텐츠를 대체 할 수있는 대체 코드를 찾고 있습니다. 마음에태그의 내용을 특정 클래스로 바꿉니다.

$class = "blah"; 
$content = "new content"; 
$html = '<div class="blah">hello world</div>'; 

// code to replace, $html now looks like: 
// <div class="blah">new content</div> 

벌거 벗은 것을 :

  1. 그것은 반드시 사업부를 습관 때문일 수 있습니다 <h2 class="blah">
  2. 여전히 하나 개 이상의 클래스를 가질 수 클래스는, 예를 들어 교체 할 필요가
  3. 나는 그런 (이 PHP4 호환 될 수 있기 때문에 가능하면 차라리이를 방지 것이지만)를 DOM 클래스를 사용하는 등 다른 제안에 열려입니다하지 않을 경우 <div class="foo blah green">hello world</div>

내가 정규식을 생각하고하는 것은,이 작업을 수행 할 수 있어야한다 .

+0

자바 스크립트, 특히 jQuery로 처리 할 수 ​​있다면 매우 쉽습니다. –

+0

일부 html 파서가 php4에 존재하는 것으로 보입니다. http://www.google.com/search?client=ubuntu&channel=fs&q=html+parser+php4&ie=utf-8&oe=utf-8 – greg0ire

+0

게시 된 정규 표현식을 사용합니다. 전에 simple_html_dom을 사용하는 것도 가능한 해결책입니다. – 2ndkauboy

답변

1

Do not use regular expressions to parse HTML. 내가 PHP4 요구 사항을 보지 못했다,

require_once("simple_html_dom.php"); 

$class = "blah"; 
$content = "new content"; 
$html = '<div class="blah">hello world</div>'; 

$doc = new simple_html_dom(); 
$doc->load($html); 

foreach ($doc->find("." . $class) as $node) { 
    $node->innertext = $content; 
} 

죄송합니다 : 당신은 DOMDocument 내장, 또는 뭔가 simple_html_dom처럼 사용할 수 있습니다. 위에서 언급 한 표준 DOMDocument를 사용하는 솔루션이 있습니다.

function DOM_getElementByClassName($referenceNode, $className, $index=false) { 
    $className = strtolower($className); 
    $response = array(); 

    foreach ($referenceNode->getElementsByTagName("*") as $node) { 
     $nodeClass = strtolower($node->getAttribute("class")); 

     if (
       $nodeClass == $className || 
       preg_match("/\b" . $className . "\b/", $nodeClass) 
      ) { 
      $response[] = $node; 
     } 
    } 

    if ($index !== false) { 
     return isset($response[$index]) ? $response[$index] : false; 
    } 

    return $response; 
} 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 

foreach (DOM_getElementByClassName($doc, $class) as $node) { 
    $node->nodeValue = $content; 
} 

echo $doc->saveHTML(); 
+0

bobince의 호언 장담에 미끄러지는 +1 : P – Matt

+0

현대보다 더 근사한 서사시입니다. –

-2

DOM 클래스를 사용할 필요가 없습니다. Khnle이 말한 것처럼 jQuery를 사용하면 DOM 클래스를 사용할 필요가 없거나 preg_replace() 함수를 사용할 수 있습니다. 나에게 시간을 좀주세요, 당신을 위해 빠른 정규 표현식을 쓸 수 있습니다.

하지만 jQuery와 같은 것을 사용하는 것이 좋습니다. 이렇게하면 페이지를 사용자에게 신속하게 제공하고 서버 대신 서버에서 처리를 수행 할 수 있습니다.

+0

그리고 사용자가 JavaScript를 비활성화 한 경우 어떻게해야합니까? 서버에서 클라이언트가 할 수있는 속도로 서버에서 수행 할 수 있다면 JS에서 뭔가를 수행하는 것은 결코 좋은 생각이 아닙니다. – 2ndkauboy

+0

Javascript와 jQuery는 모든 것을 해결할 수있는 솔루션이 아닙니다. – Matt

+0

+ 요점은 jQuery를 사용할 수 없다는 것입니다. 서버 측이어야합니다! – fire

-1

$ html이 유효한 HTML 코드라고 확신하는 경우 유효한 XML 코드 인 경우 HTML 구문 분석기 또는 XML 구문 분석기를 사용할 수 있습니다.

그러나 정규식에서 신속하고 더러운 방법은 무언가 같이 될 것이다 :

$html = preg_replace('/(<[^>]+ class="[^>]*' . $class . '[^"]*"[^>]*>)[^<]+(<\/[^>]+>)/siU', '$1' . $content . '$2', $html); 

너무 많이 테스트하지 못했지만, 그것을 작동합니다. 그렇지 않은 경우를 찾으면 알려주십시오. ;)

편집 : 추가 "더러운"...;)

편집 2 : 정규식의 새로운 버전 :

<?php 

$class = "blah"; 
$content = "new content"; 
$html = '<div class="blah test"><h1><span>hello</span> world</h1></div><div class="other">other content</div><h2 class="blah">remove this</h2>'; 

$html = preg_replace('/<([\w]+)(\s[^>]*class="[^"]*' . $class . '[^"]*"[^>]*>).+(<\/\\1>)/siU', '<$1$2' . $content . '$3', $html); 

echo $html; 

?> 

마지막 문제가 남아 인 경우에만 프로그래머 클래스 "tooMuchBlahNow"와 같은 그 이름에 "blah". 우리가 어떻게 대응할 수 있는지 보도록하겠습니다. Btw : 내가 RegEx를 가지고 노는 것을 좋아한다는 것이 이미 명백한가요? ;)

+0

@ b-i-d이 태그는 영숫자 문자로 작동하지만 태그 내부에 HTML이있는 것은 아닙니다 ...? – fire

+0

그래, 그 질문의 사양에 아니었다. 태그의 HTML의 경우 RegEx가 좀 더 복잡해야합니다. 그것에 대해 생각하게 해주세요 ... –

+0

내 대답이 업데이트되었습니다. 단 하나의 "문제"가 남았습니다. –

관련 문제