Belirli bir sınıf ile bir etiketinin içeriğini değiştirin

3 Cevap php

Bana belli bir sınıf örneğin olan herhangi bir HTML etiketi içinde içeriğini değiştirmek sağlar uygun yedek kod arıyorum

$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>

Çıplak aklınızda:

  1. Mutlaka bir div olmayacak, bu olabilir <h2 class="blah">
  2. Sınıf, birden fazla sınıf var ve hala örneğin değiştirilmesi gerekiyor olabilir <div class="foo blah green">hello world</div>

Böyle DOM sınıfını kullanarak diğer önerileri açık değilse (eğer mümkünse uyumlu PHP4 olmak zorunda çünkü ben daha ziyade bu önleyeceğini rağmen), düzenli ifadeler bunu yapmak mümkün olmalıdır düşünüyorum.

3 Cevap

Do not use regular expressions to parse HTML. Sen kullanabilirsiniz gibi DOMDocument, ya da bir şey inşa simple_html_dom:

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;
}

Üzgünüm, PHP4 gereksinimi görmedim. Buradan yukarıda belirtildiği gibi, standart DOMDocument kullanarak bir çözümdür.

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();

Eğer $ html geçerli HTML kodu olduğundan eminseniz geçerli XML kodu eğer, bir HTML çözümleyici hatta XML çözümleyici kullanabilirsiniz.

Ama Regex içinde hızlı ve kirli bir yol gibi bir şey olurdu:

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

Çok fazla test etmedim ama çalışması gerekir. Eğer öyle değil durumlarda bulursan söyle. ;)

Edit: Ekleme "ve kirli" ... ;)

Düzenleme 2: RegEx'in yeni versiyonu:

<?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;

?>

Sadece "tooMuchBlahNow" gibi, adında "blah" olan bir sınıf gidecekseniz eğer sol son sorundur. Şimdi bunu nasıl ele görelim. Btw: ben RegEx'in ile oynamayı seviyorum zaten bu belli mi? ;)

DOM sınıfını kullanmak için gerek yoktur, Khnle dediği gibi bu, muhtemelen, jQuery kullanarak hızlı yapılabilir olacaktır veya preg_replace () işlevini kullanabilirsiniz. Bana biraz zaman ver, ben size hızlı bir regex yazabilirsiniz.

Ama jQuery, hızlı kullanıcıya sayfa kadar hizmet ve onların bilgisayar yerine sunucu işlem yapmak için izin verebilirsiniz bu şekilde gibi bir şey kullanarak öneriyoruz.