domDocument - глючит парсер

Metal Messiah
На сайте с 01.08.2010
Offline
163
518

Доброго времени суток.

Данный код

$dom = new domDocument;

$dom->loadHTML($str);
...
$str=$dom->saveHTML();

отлично работает на большинстве HTML документов. Но проблемка в том что из данного кода

$(o2).css({toppos['top'])+'px',leftpos['left'])+'px',width.offsetWidth+'px',height.offsetHeight+'px',display:''}).html('<div align="left" style="padding:5px;"><div class="myWinLoad"></div></div>');

после сохранения получается следующее:

$(o2).css({toppos['top'])+'px',leftpos['left'])+'px',width.offsetWidth+'px',height.offsetHeight+'px',display:''}).html('<div align="left" style="padding:5px;"><div class="myWinLoad"></script>
</div>
</div>');

Лишние переводы строк перед </div> нарушают целостность JS кода, появляется незавершенная строка, </script> там где его не было и еще много интересного. При этом в конце кода </script> пропадает и кусок кода отображается текстом.

Воспроизводится на любом подобном HTML коде, где в кавычки включен HTML, независимо от значения параметров domDocument: preserveWhiteSpace, formatOutput, validateOnParse, recover. От платформы и версии PHP не зависит (изначально писал под Denwer, на реальном сервере под Linux все то же). Баг? У кого-то есть мысли как с этим бороться без написания собственного парсера?

anonymous, думай что говоришь и не забывай подписать отзыв :)
S
На сайте с 30.09.2016
Offline
469
#1
Metal_Messiah:
из данного кода

Данный код - какая-то лапша

css({toppos['top'])+'px',leftpos['left'])+'px',width.offsetWidth+'px',height.offsetHeight+'px',display:''})
Разберитесь со скобками.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Metal Messiah
На сайте с 01.08.2010
Offline
163
#2

Пусть и лапша, проблема в DOM парсере, он должен всю лапшу оставлять внутри <script> и </script>. Вот другой пример исковерканого кода:

Было:

jQuery("#postFormContent").html('<div style="width:100%;text-align:center;padding-top:50px;"><img alt="" src="/.s/img/ma/m/i3.gif" border="0" width="220" height="19" /></div>');

Стало:

jQuery("#postFormContent").html('<div style="width:100%;text-align:center;padding-top:50px;"><img alt="" src="/.s/img/ma/m/i3.gif" border="0" width="220" height="19" /></script>
</div>');

Если сделать обратную замену </script>\r\n</div>'); на </div>'); не составляет труда, то написать код который будет определять универсальным образом то место куда нужно вставить пропавший </script> - не реально.

S
На сайте с 30.09.2016
Offline
469
#3
Metal_Messiah:
Пусть и лапша

А какой смысл запихивать в парсер заведомо невалидный код? Хотите проверить, как парсер исправляет ошибки? Так он и наисправляет, исходя непонятно из каких соображений.

Metal Messiah
На сайте с 01.08.2010
Offline
163
#4

Моя задача из заведомо правильного либо неправильного HTML документа (это я не знаю) сделать правильный, почищенный от мусора. Мусор чистится нормально, проблема возникает только при наличии </div> внутри JS кода.

S
На сайте с 30.09.2016
Offline
469
#5
Metal_Messiah:
проблема возникает только при наличии </div> внутри JS кода.

Поставьте </nav> вместо </div> - то же самое будет. Проблемы не в div, а в <script>. ХЗ в чём там дело, но у domDocument всегда были проблемы со скриптами.

Metal Messiah
На сайте с 01.08.2010
Offline
163
#6

Он ищет любые закрывающие теги, находит его в теле строковой константы, далее понимает что раз тег закрывается значит это незакрытый <script>, закрывает его и ставит перевод строки, после чего крашится вся разметка. Отключить "исправление" таких "ошибок", по видимому, нельзя. Для меня это новость потому что не первый год работаю с DOMDocument, да, скармливал ему обычно отрывки документов, выводы из визуальных редакторов и прочие дела, но почти никогда всю страницу целиком, но даже если целиком (задача была извлечения текста статьи из HTML кода с определением тега внутри которого содержится контент) то таких приколов не было...

infant
На сайте с 15.03.2008
Offline
170
#7
Metal_Messiah:
Пусть и лапша, проблема в DOM парсере

Не стал сильно разбираться, но в глаза бросилась проблема со скобками. Одна открывающая и три закрывающих.

Metal Messiah
На сайте с 01.08.2010
Offline
163
#8

Да это пример одного из сбойных кодов... на вход парсеру может подаваться все что угодно, главное чтобы это правильно обрабатывалось. Выше я привел другой пример абсолютно валидного кода, но который тоже валится. Сейчас буду пробовать альтернативные решения в других языках программирования, потому что это не дело.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий