Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Валидация? #177

Open
KarelWintersky opened this issue Dec 3, 2021 · 6 comments
Open

Валидация? #177

KarelWintersky opened this issue Dec 3, 2021 · 6 comments

Comments

@KarelWintersky
Copy link

Есть ли возможность проверить, что документ, загруженный в

$document = new Document();
$document->loadHtml($html);

Является валидным HTML-документом: нет контента вне тегов, атрибуты записаны корректно итд...

?

@BasToTheMax
Copy link

?

@KarelWintersky
Copy link
Author

@BasToTheMax вы имеете какое-то отношение к автору пакета? Нет? Лесом.

@Imangazaliev
Copy link
Owner

@KarelWintersky такой возможности нет.

нет контента вне тегов

Вроде, это не запрещено.

нет контента вне тегов

Нужно больше конкретики.

@Imangazaliev
Copy link
Owner

вы имеете какое-то отношение к автору пакета? Нет? Лесом.

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

@KarelWintersky
Copy link
Author

@Imangazaliev , смотрите, у нас на новостном сайте (47news.ru) редакторы добавляют новости через админку. У нас используется CKEditor и по умолчанию он генерирует вполне валидный код:

<p><strong>В Кировске трубу прорвало ещё раз после того, как коммунальщики были уверены, что её залатали.</strong></p>

<p>И. о. главы администрации Кировского района Андрей Шорников сообщил 47news, что тепло в дома жителей Кировска должно поступить в районе часа ночи. "Заполняют систему, подают тепло", - сказал он. По словам чиновника, уже вечером, после того, как коммунальщики отчитались <a href="https://47news.ru/articles/203934/" target="_blank">об устранении аварии</a>, трубу прорвало ещё раз.</p>

<p>Ранее 47news писал о том, что утром 1 декабря произошел прорыв трубы, который оставил жителей двух микрорайонов города без благ цивилизации. В <a href="https://m.47news.ru/articles/203907/" style="outline:none; font-variant-ligatures:normal; text-align:start; color:#0563c1; text-decoration:underline" target="_blank">зоне отключения находятся 15 тысяч человек</a>. Местные жители сообщают, что в этом месте прорывы происходят постоянно, такое было и летом.</p>

Например, такой. То есть каждый абзац завернут в <p></p> или другой блочный тег (blockquote, ul, div).

Далее, возникла задача вставить "инрид-баннеры" в текст. Это баннеры после каждого, допустим, третьего абзаца (реальные правила сложнее, упрощаю для краткости). Для этого я беру вашу библиотеку, режу текст на блоки конструкцией:

$document = new Document();
$document->loadHtml($html_source);

$html_target = [];

foreach ($document->find('body > *', Query::TYPE_CSS, true) as $n => $p) {
  $p_content = $p->html();
  // вся магия тут
}
return implode(PHP_EOL, $html_target);

и все работает...

НО:
Иногда, мы так и не выяснили, в каких случаях и почему в результате действий редактора текст, отдаваемый CKEditor'ом выглядит так:

<p>И. о. главы администрации .... трубу прорвало ещё раз.</p>
Ранее 47news писал о том, что утром 1 декабря произошел прорыв трубы, который оставил жителей двух микрорайонов города без благ цивилизации. В <a href="https://m.47news.ru/articles/203907/" style="outline:none; font-variant-ligatures:normal; text-align:start; color:#0563c1; text-decoration:underline" target="_blank">зоне отключения находятся 15 тысяч человек</a>. Местные жители сообщают, что в этом месте прорывы происходят постоянно, такое было и летом.

Обратите внимание - просто текст идет после закрытого тега P.

Браузеру понятно пофигу, он включает квирк-режим и показывает как умеет. А вот алгоритму вставки баннеров не пофигу. Он превращает результат примерно в такое:

<p>И. о. главы администрации .... трубу прорвало ещё раз.</p>
<a>зоне отключения находятся 15 тысяч человек</a>

Делает он это совершенно правильно, претензий к пакету ни-ка-ких :) Но вот такой текст является с точки зрения моей задачи невалидным.

Я думал о регулярке, которая проверяла бы "ошибкой является все то, что содержит строки НЕ начинающиеся с тега, но черт возьми, они обожают писать диалоги в тексте:

<p>-- а вы обращались в полицию<br>
-- ну да<br>
-- и что сказали?<br>
-- ничего </p>

Очевидно, это валидный блок кода, он будет штатно обработан вашим пакетом... но не регуляркой!

И в общем непонятно что с этим делать.

@KarelWintersky
Copy link
Author

Пока что в рамках планового извращения я при сохранении статьи преобразую исходный текст набором правил к некому виду, его режу на блоки, склеиваю в текст и потом сравниваю с исходником. Одинаковые - значит типа все ок, баннеры вставятся корректно.

Нет, ставлю в админке флаг "в эту статью баннеры не ставить".

Но это же извращение какое-то!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants