我想清理数据库中许多文本列的内容,这些列包含由不同的所见即所得的编辑生成的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());
答案 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>
请访问指定的链接以获取更多信息。