Мне было интересно, возможно ли решить эту проблему более CCS, например, с помощью селектора.В CSS3 можно обращаться только к тем тегам <a>
, которые не имеют атрибута style
:
a:not([style]) {border:1px solid #000;}
Так что, если у ваших документов уже есть таблица стилей, ее можно легко добавить.
Если нет, то в документ необходимо добавить <style>
.Это также можно сделать с помощью DomDocument, но я нашел это немного сложным.Однако я заставил его работать для небольшой игры:
libxml_use_internal_errors(true);
$html = '<a href="#">test</a>'.
'<a href="#" style="border:1px solid #000;">test2</a>';
$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->normalizeDocument();
// ensure that there is a head element, body will always be there
// because of loadHtml();
$head = $dom->getElementsByTagName('head');
if (0 == $head->length) {
$head = $dom->createElement('head');
$body = $dom->getElementsByTagName('body')->item(0);
$head = $body->parentNode->insertBefore($head, $body);
} else {
$head=$head->item(0);
}
// append style tag to head.
$css = 'a:not([style]) {border:1px solid #000;}';
$style = $dom->createElement('style');
$style->nodeValue=$css;
$head->appendChild($style);
$dom->formatOutput = true;
$output = $dom->saveHtml();
echo $output;
Пример вывода:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><style>a:not([style]) {border:1px solid #000;}</style></head>
<body>
<a href="#">test</a><a href="#" style="border:1px solid #000;">test2</a>
</body>
</html>
Если CSS конфликтует с другими, более высокими селекторами, это не простое решение.!important
может помочь, хотя.
Фрагмент HTML
И что касается получения измененного фрагмента HTML, то это дополнительный код, который может работать с предложением Гордона.Просто внутренний html тега body, на этот раз я немного поиграл с SPL:
// get html fragment
$output = implode('', array_map(
function($node) use ($dom) { return $dom->saveXml($node); },
iterator_to_array($xpath->query('//body/*'), false)))
;
Foreach определенно более удобен для чтения и памяти:
// get html fragment
$output = '';
foreach($xpath->query('//body/*') as $node)
$output .= $dom->saveXml($node)
;