У меня проблема, когда я отобразил до 400 символов строки, вытаскиваемой из базы данных, однако эта строка должна содержать HTML-объекты.
Случайно, клиент создал строку, чтобы 400-й символ сидел прямо посередине закрывающего тега P, тем самым убивая тег, в результате чего другие ошибки для кода после него.
Я бы предпочел, чтобы этот закрывающий тег P полностью удалялся, поскольку у меня есть ссылка «… читать дальше», прикрепленная к концу, которая будет выглядеть более чистой, если она привязана к существующему абзацу.
Каким будет лучший подход для этого, чтобы охватить все проблемы HTML Entity? Есть ли функция PHP, которая автоматически закрывает / удаляет любые ошибочные 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);