在DOM元素php中扩展样式属性

时间:2018-01-08 16:18:05

标签: php domdocument

我想清理数据库中许多文本列的内容,这些列包含由不同的所见即所得的编辑生成的HTML代码。

在这种情况下,我想删除align属性,并将其附加到每个段落中的style属性style='text-align: left|right|center'。我还想确保不删除style属性的现有值。 我决定因为这个原因我将使用DOMDocument。 我没有找到一种方法来简单地将新值附加到现有属性。

如果没有第三方库(如SQL查询或REGEXP),请告诉我是否有更好或更好的表现方式。

$DOMDoc = new DOMDocument('1.0', 'UTF-8');
$DOMDoc->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NODEFDTD | LIBXML_COMPACT | LIBXML_NOERROR | LIBXML_NOWARNING);

/** @var DOMElement $paragraph */
foreach($DOMDoc->getElementsByTagName('p') as $paragraph) {
    moveAttributeToStyle($paragraph, 'align', 'text-align');
}

/**
 * @param DOMElement $paragraph
 * @param string $htmlAttrName
 * @param string $cssAttrName
 */
function moveAttributeToStyle(&$paragraph, $htmlAttrName, $cssAttrName)
{
    if ($paragraph->hasAttribute($htmlAttrName)) {
        $htmlAttrValue = $paragraph->getAttribute($htmlAttrName);
        $paragraph->removeAttribute($htmlAttrName);

        if ($paragraph->hasAttribute('style')) {
            $attributes = explode(';', $paragraph->getAttribute('style'));
            $attributes[] = sprintf('%s: %s;', $cssAttrName, $htmlAttrValue);
            $paragraph->setAttribute('style', implode('; ', array_filter(array_map('trim', $attributes))));
        } else {
            $paragraph->setAttribute('style', sprintf('%s: %s;', $cssAttrName, $htmlAttrValue));
        }
    }
}

$text = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $DOMDoc->saveHTML());

1 个答案:

答案 0 :(得分:0)

我建议使用PHP Simple HTML DOM Parser

示例代码:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

请访问指定的链接以获取更多信息。