Intereting Posts
Можно ли включить и вызвать функцию JavaScript из PHP-скрипта? И как? Комментарий миграции Laravel 5.2 в столбце миграции Примеры SQL-инъекций с помощью addlashes ()? pg_query_params return error: bind message supplies 2 параметра, но подготовленный оператор "" требует 1 Как показать печать с помощью AJAX / jQuery? Неверный вывод PHP date () на сервере Wamp php 5.1.6 magic __toString метод Извлечь объект JSON внутри объекта JSON через php echo html значение тега отдельно для разных блоков Какой метод более безопасен / подходит для блокировки доступа к подкаталогу с использованием .htaccess? Изменить URL-адрес ответа без перенаправления Объединение 2 pdf с Zend Framework Не получайте сообщение об ошибке, если имя входа неверно, просто пустой div, но я могу определить неправильный пароль, если имя пользователя правильно Загрузка файла с другим именем в сохраненное имя Эффективный способ проверить, находится ли текущая дата между двумя датами (годы не имеют значения)

Удалить HTML-объект, если он неполный

У меня проблема, когда я отобразил до 400 символов строки, вытаскиваемой из базы данных, однако эта строка должна содержать HTML-объекты.

Случайно, клиент создал строку, чтобы 400-й символ сидел прямо посередине закрывающего тега P, тем самым убивая тег, в результате чего другие ошибки для кода после него.

Я бы предпочел, чтобы этот закрывающий тег P полностью удалялся, поскольку у меня есть ссылка «… читать дальше», прикрепленная к концу, которая будет выглядеть более чистой, если она привязана к существующему абзацу.

Каким будет лучший подход для этого, чтобы охватить все проблемы HTML Entity? Есть ли функция PHP, которая автоматически закрывает / удаляет любые ошибочные HTML-теги? Мне не нужен закодированный ответ, просто направление поможет.

Благодарю.

Solutions Collecting From Web of "Удалить HTML-объект, если он неполный"

Вот простой способ сделать это с DOMDocument, его не совершенным, но он может представлять интерес:

<?php function html_tidy($src){ libxml_use_internal_errors(true); $x = new DOMDocument; $x->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$src); $x->formatOutput = true; $ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $x->saveHTML()); return trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret)); } $brokenHTML[] = "<p><span>This is some broken html</spa"; $brokenHTML[] = "<poken html</spa"; $brokenHTML[] = "<p><span>This is some broken html</spa</p>"; /* <p><span>This is some broken html</span></p> <poken html></poken> <p><span>This is some broken html</span></p> */ foreach($brokenHTML as $test){ echo html_tidy($test); } ?> 

Хотя обратите внимание на комментарий Mike 'Pomax' Kamermans .

почему вы не берете последнее слово в абзаце или содержании и не удаляете его, если слово завершено, вы его удаляете, если оно не завершено, вы также удаляете его, и вы уверены, что контент по-прежнему чист, я покажу вам пример, какой код будет выглядеть:

 while($row = $req->fetch(PDO::FETCH_OBJ){ //extract 400 first characters from the content you need to show $extraction = substr($row->text, 0, 400); // find the last space in this extraction $last_space = strrpos($extraction, ' '); //take content from the first character to the last space and add (...) echo substr($extraction, 0, $last_space) . ' ...'; } 

просто удалите последний сломанный тег, а затем strip_tags

 $str = "<p>this is how we do</p"; $str = substr($str, 0, strrpos($str, "<")); $str = strip_tags($str);