用某个类替换标记的内容

时间:2010-06-03 16:33:10

标签: php html

我正在寻找合适的替换代码,允许我替换任何具有特定类别的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. 它不一定是div,可能是<h2 class="blah">
  2. 该课程可以有多个课程,但仍需要更换,例如<div class="foo blah green">hello world</div>
  3. 我认为正则表达式应该能够做到这一点,如果不是我对其他建议开放,比如使用DOM类(尽管如果可能的话我宁愿避免使用它,因为它必须与PHP4兼容)。

3 个答案:

答案 0 :(得分:1)

Do not use regular expressions to parse HTML。您可以使用内置的DOMDocument或类似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;
}

抱歉,我没有看到PHP4的要求。这是使用上面提到的标准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();

答案 1 :(得分:-1)

如果您确定$ html是有效的HTML代码,那么如果它是有效的XML代码,您可以使用HTML解析器甚至XML解析器。

但正则表达式中快速而肮脏的方式将是:

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

没有测试太多,但它应该工作。如果你发现没有的情况,请告诉我。 ;)

编辑:添加“和脏”......;)

编辑2:RegEx的新版本:

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

?>

剩下的最后一个问题是,如果一个类名称中只有“blah”,例如“tooMuchBlahNow”。让我们看看我们如何解决这个问题。顺便说一句:我喜欢玩RegEx吗? ;)

答案 2 :(得分:-2)

没有必要使用DOM类,这可能会使用jQuery最快,就像Khnle所说,或者你可以使用preg_replace()函数。给我一些时间,我可以为你写一个快速的正则表达式。

但我建议使用像jQuery这样的东西,这样你就可以快速地将页面提供给用户并让他们的计算机代替你的服务器进行处理。