Исправление незакрытых тегов HTML - PullRequest
8 голосов
/ 14 декабря 2011

Я работаю над некоторым макетом блога, и мне нужно создать реферат каждого поста (скажем, 15 самых последних), чтобы показать его на главной странице.Теперь содержимое, которое я использую, уже отформатировано в HTML-тегах текстильной библиотекой.Теперь, если я использую substr, чтобы получить первые 500 символов поста, основная проблема, с которой я сталкиваюсь, заключается в том, как закрыть незамкнутые теги.

например,

<div>.......................</div>
<div>...........
     <p>............</p>
     <p>...........| 500 chars
     </p>
<div>  

То, что я получаю, это два незамкнутыхтеги

и

, не доставят много хлопот, но div просто портит весь макет страницы.Так что есть предложения, как отследить открывающие теги и закрыть их вручную или что-то в этом роде?

Ответы [ 3 ]

16 голосов
/ 14 декабря 2011

Существует множество методов, которые можно использовать:

  1. Использовать правильный анализатор HTML, например DOMDocument
  2. Использовать PHP Tidy для исправления незамкнутого тега
  3. Некоторые рекомендуют Очиститель HTML
12 голосов
/ 11 января 2017

Как сказал ajreal, DOMDocument - это решение.

Пример:

$str = "
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  <p>error</i>
 </body>
</html>
";

$doc = new DOMDocument();
@$doc->loadHTML($str);
echo $doc->saveHTML();

Преимущество: изначально включено в PHP, в отличие от PHP Tidy.

1 голос
/ 04 апреля 2017

Вы можете использовать DOMDocument для этого, но будьте осторожны с проблемами кодирования строк.Кроме того, вам придется использовать полный HTML-документ, а затем извлечь нужные компоненты.Вот пример:

function make_excerpt ($rawHtml, $length = 500) {
  // append an ellipsis and "More" link
  $content = substr($rawHtml, 0, $length)
    . '&hellip; <a href="/link-to-somewhere">More &gt;</a>';

  // Detect the string encoding
  $encoding = mb_detect_encoding($content);

  // pass it to the DOMDocument constructor
  $doc = new DOMDocument('', $encoding);

  // Must include the content-type/charset meta tag with $encoding
  // Bad HTML will trigger warnings, suppress those
  @$doc->loadHTML('<html><head>'
    . '<meta http-equiv="content-type" content="text/html; charset='
    . $encoding . '"></head><body>' . trim($content) . '</body></html>');

  // extract the components we want
  $nodes = $doc->getElementsByTagName('body')->item(0)->childNodes;
  $html = '';
  $len = $nodes->length;
  for ($i = 0; $i < $len; $i++) {
    $html .= $doc->saveHTML($nodes->item($i));
  }
  return $html;
}

$html = "<p>.......................</p>
  <p>...........
    <p>............</p>
    <p>...........| 500 chars";

// output fixed html
echo make_excerpt($html, 500);

Выходы:

<p>.......................</p>
  <p>...........
    </p>
<p>............</p>
    <p>...........| 500 chars… <a href="/link-to-somewhere">More &gt;</a></p>

Если вы используете WordPress, вы должны заключить вызов substr() в вызов к wpautop - wpautop(substr(...)).Вы также можете проверить длину $ rawHtml, переданного функции, и пропустить добавление ссылки «Еще», если она недостаточно длинна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...