Добрый день! Мне нужно Написать функцию, которая на входе принимает массив из открывающихся или закрывающихся тегов, а возвращает результат проверки корректности. Вот что у меня сделано, но работает неправильно. Подскажите, в чем проблема или нужно мне другой алгоритм решения? Спасибо.
(например “<a>”, “</td>” )
$корректная_структура = ['<a>', '<div>', '</div>', '</a>', '<span>', '</span>'];
$некорректная_структура = ['<a>', '<div>', '</a>', '<p>' , '</tr>'];
function validate_html_tags($html_tags) {
$tags = htmlspecialchars(implode("", $html_tags));
$html_doc="<!DOCTYPE html>" . "<html><body>" . $tags . "</body></html>";
// $html_doc="<!DOCTYPE html>" . $tags . ;
$dom = new DOMDocument;
$dom->loadHTML($html_doc);
$dom->saveHTML();
if ($dom->validate()) {
echo "This document is valid!\n";
} else {
echo "This document is invalid!\n";
}
return $tags;
}
Вот ошибки:
Warning: DOMDocument::validate(): No declaration for element html in
Warning: DOMDocument::validate(): No declaration for element body in
This document is invalid! string(67) "<a><div></div></a><span></span>"
Warning: DOMDocument::validate(): No declaration for element html in
Warning: DOMDocument::validate(): No declaration for element body in
Первые 2 ошибки возникли из-за того, что Вы использовали метод saveHtml для неправильной структуры домдокумента без валидации.
3 сообщение - оповещение о том, что документ не прошел валидацию.
Вы пропустили <head> и класс DOMDocument ругается на некорректный документ.
Замените
$html_doc="<!DOCTYPE html>" . "<html><body>" . $tags . "</body></html>";
На
$html_doc="<!DOCTYPE html><html><head></head><body>" . $tags . "</body></html>";
И $dom->saveHTML(); добавьте после успешной валидации
И раз уж задача состоит в возвращает результат проверки корректности то возвращать нужно не $tag, а true или false в зависимости от результатов. Вот переделанный вариант функции
function validate_html_tags($html_tags) {
$tags = htmlspecialchars(implode("", $html_tags));
$html_doc="<!DOCTYPE html><head></head><html><body>" . $tags . "</body></html>";
$dom = new DOMDocument;
$dom->loadHTML($html_doc);
if ($dom->validate()) {
echo "This document is valid!\n";
$dom->saveHTML(); // хотя зачем тут это
return true;
}
echo "This document is invalid!\n";
return false;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости