Разобрать действительный html (php - tidy)

Я хочу использовать аккуратный плагин, но только для одной строки. Код, который я использую:

tidy_repair_string($string);

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

Но приведите в порядок дубликаты тегов html, body, title (общие теги для файла).

Как можно проверить только мою строку без возврата HTML и т. Д., И т. Д.?

Пример: если моя строка <b><s>Text</b> Хочу только приборку вернуть <b><s>Text</s></b>

НЕ

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<b><s>Text</s></b>
</body>
</html>

Спасибо!

2 ответа

Как вы уже отметили в своем вопросе, Tidy работает с полным HTML-документом, поэтому исправленный содержит (если настроен) тип документа, но всегда заголовок.

Вы ищете фрагмент HTML, который не является полным документом HTML.

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

/* Tidy example: Clean a HTML fragment */

$fragment = '<b><s>Text</b>';

$tidy = new Tidy;
$tidy->parseString($fragment);
$tidy->cleanRepair();

$result = implode('', (array) $tidy->body()->child); // <b><s>Text</s></b>

Если вы хотите пойти еще дальше и проверить фрагмент HTML (например, только допустимые теги HTML и все закрытые теги, см. Также аккуратную настройку), вы можете поставить перед ним минимальный HTML-код, чтобы ошибки и предупреждения попадали в сферу ответственности сам фрагмент Статус можно получить через tidy::getStatus():

/* Tidy example: Validate a HTML fragment (4 samples) */

$fragments = [
    ['Valid fragment', '<b><s>Text</s></b>'],
    ['Unclosed tag', '<b><s>Text</b>'],
    ['Unknown tag', '<unknown></unknown>'],
    ['Unfinished attribute', '<a href=">link</a>'],
];

$tidy = new Tidy;

foreach ($fragments as list($title, $fragment)) {
    $tidy->parseString("<!DOCTYPE html><title>HTML fragment</title><body>" . $fragment);
    $status = $tidy->getStatus();
    $tidy->cleanRepair();
    $result = implode('', (array)$tidy->body()->child);
    printf("%s - Status: %d\n  HTML: %s\n  Repaired: %s\n", $title, $status, $fragment, $result);
}

Этот пример предоставит следующий вывод, демонстрирующий значение возвращаемого значения getType в конфигурации по умолчанию:

Valid fragment - Status: 0
  HTML: <b><s>Text</s></b>
  Repaired: <b><s>Text</s></b>
Unclosed tag - Status: 1
  HTML: <b><s>Text</b>
  Repaired: <b><s>Text</s></b>
Unknown tag - Status: 2
  HTML: <unknown></unknown>
  Repaired: 
Unfinished attribute - Status: 2
  HTML: <a href=">link</a>
  Repaired: <a href="%3Elink%3C/a%3E"></a>

Это больше, чем вы просили, и я добавил его только в качестве дополнительного примера, например, чтобы увидеть, все ли теги в строке закрыты.

Возможно это работает. если нет, обратитесь к http://tidy.sourceforge.net/docs/quickref.html за дополнительными опциями

$string = tidy_repair_string($string, array(
'output-html' => false,
'doctype' => false)); 
Другие вопросы по тегам