【问题标题】:PHP equivalent to jQuery addClassPHP 等价于 jQuery addClass
【发布时间】:2011-08-28 16:57:51
【问题描述】:

如何使用 php 将名为 newClass 的类添加到 opening 标记中,例如 <a class='abc'><p style=display:block>

【问题讨论】:

  • 对于您正在使用 PHP 解析的现有文件,或者您正在使用 PHP 生成的文件?
  • 它生成的只是一个开始标签。
  • 那么,您解析现有文件?然后通常的方法是在应该出现的地方写class="newClass"...你能澄清一下你的情况吗?
  • 我的函数生成两个 HTML 代码之间的差异。修改后的字符串被新的 span 包裹,但修改后的现有元素应该获得一个额外的类。
  • @Ghommey 我真的建议为此使用 DOM* 功能。如果你能给出更详细的例子,我们一定能更好地帮助你。

标签: php string dom-manipulation


【解决方案1】:

正则表达式示例:

<?php
function addClass($htmlString = '', $newClass) {
    $pattern = '/class="([^"]*)"/';

    // class attribute set
    if (preg_match($pattern, $htmlString, $matches)) {
        $definedClasses = explode(' ', $matches[1]);
        if (!in_array($newClass, $definedClasses)) {
            $definedClasses[] = $newClass;
            $htmlString = str_replace($matches[0], sprintf('class="%s"', implode(' ', $definedClasses)), $htmlString);
        }
    }

    // class attribute not set
    else {
        $htmlString = preg_replace('/(\<.+\s)/', sprintf('$1class="%s" ', $newClass), $htmlString);
    }

    return $htmlString;
}

echo addClass('<a class="abc">', 'newClass');
echo addClass('<p style=display:block>', 'newClass');

使用http://php.net/manual/en/book.dom.php 示例

<?php
function addClass($node = null, $className) {
    $result = false;

    if (is_string($node)) {
        $dom = DOMDocument::loadXml($node);
        if ($dom instanceof DOMDocument) {
            $definedClasses = explode(' ', $dom->documentElement->getAttribute('class'));
            if (!in_array($className, $definedClasses)) {
                $dom->documentElement->setAttribute(
                    'class', $dom->documentElement->getAttribute('class') . ' ' . $className
                );
            }

            $result = $dom->saveXml($dom->documentElement, true);
        }
    }
    elseif ($node instanceof DOMElement) {
        // this code repetition, could of course be avoided using some more sophisticated structures 
        $definedClasses = explode(' ', $node->getAttribute('class'));
        if (!in_array($className, $definedClasses)) {
            $node->setAttribute('class', $node->getAttribute('class') . ' ' . $className);
        }

        $result = $node;
    }

    return $result;
}

// using a string as input
echo addClass('<a class="abc"></a>', 'newClass');

// using a DOMElement as input
$dom = DOMDocument::loadHtml('<div><a id="something"></a></div>');
$xpath = new DOMXPath($dom);

$node = $xpath->query('//*[@id="something"]')->item(0);
if ($node instanceof DOMElement) {
    addClass($node, 'newClass');
    echo $dom->saveXml($node, true);
}

我故意不使用loadHTML(在函数内部)以防止不得不深入到自动生成的html结构中找到实际给定的$htmlString。这当然意味着$htmlString 必须是格式良好的。

【讨论】:

  • 很好的答案,当然,如果 OP 是真正的 jQuery 风格,那么该方法也可以很容易地修改为直接接受 DOMElement 对象。
  • @rudi_visser 你是对的。而且它可能会更可重用。我会改变它;)
  • 是否需要结束标签或者这也可以echo addClass('&lt;a class="abc"&gt;', 'newClass');
  • 它正在尝试解析 XML,所以我不希望 :-) jQuery 肯定也不允许你这样做吗?
  • 我想我必须使用正则表达式。
【解决方案2】:

Html class from Nette Framework 非常适合在 PHP 中生成 HTML 标签。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2011-06-06
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多