Какая функция в php проверяет, является ли строка верной HTML? - PullRequest
2 голосов
/ 02 июля 2010

Какие функции в php проверяют, если строка html?Моя цель взять ввод от пользователя и проверить, является ли ввод html, а не просто строка.

Пример не строки HTML:

sdkjshdk<div>jd</h3>ivdfadfsdf or sdkjshdkivdfadfsdf

Пример строки html:

<div>sdfsdfsdf<label>dghdhdgh</label> fdsgfgdfgfd</div>

Спасибо

Ответы [ 6 ]

9 голосов
/ 02 июля 2010

Может быть, вам нужно проверить, правильно ли сформирована строка.

Я бы использовал такую ​​функцию

function check($string) {
  $start =strpos($string, '<');
  $end  =strrpos($string, '>',$start);

  $len=strlen($string);

  if ($end !== false) {
    $string = substr($string, $start);
  } else {
    $string = substr($string, $start, $len-$start);
  }
  libxml_use_internal_errors(true);
  libxml_clear_errors();
  $xml = simplexml_load_string($string);
  return count(libxml_get_errors())==0;
}

Просто предупреждение: html допускает несбалансированную строку, как показано ниже.Это не допустимый фрагмент XML, но это допустимый фрагмент HTML

<ul><li>Hi<li> I'm another li</li></ul>

Отказ от ответственности Я изменил код (без его проверки) .для того, чтобы обнаружить правильно сформированный html внутри строки.

Последнее, хотя, может быть, вы должны использовать strip_tags для контроля ввода пользователя (как я видел в ваших комментариях)

3 голосов
/ 02 июля 2010

Вы имеете в виду HTML или XHTML?

Стандарт HTML и его интерпретация настолько свободны, что ваш первый фрагмент может работать. Это не будет красиво, но вы можете получить что-то .

XHTML немного более строг и как минимум будет ожидать, что ваш фрагмент будет правильно сформирован (все открытые теги закрыты; теги могут быть вложенными, но не могут перекрываться) и могут выдавать предупреждения, если вы не опознаны элементы или атрибуты.

Что-то вроде Tidy - http://php.net/manual/en/book.tidy.php - вероятно, хорошее начало. После того, как вы загрузите свой фрагмент с помощью этого, вы можете использовать tidy_error_count или tidy_get_error_buffer , чтобы проверить, достаточно ли это для ваших нужд.

1 голос
/ 19 июля 2018

simplexml_load_string потерпит неудачу, если у вас нет ни одного корневого узла.Поэтому, если вы попробуете этот html:

<p>A</p><p>B</p>, он будет недействительным.

Вот моя функция:

function check($string){
    $start = strpos($string, '<');
    $end = strrpos($string, '>', $start);

    if ($end !== false) {
        $string = substr($string, $start);
    } else {
        $string = substr($string, $start, strlen($string) - $start);
    }

    // xml requires one root node
    $string = "<div>$string</div>";

    libxml_use_internal_errors(true);
    libxml_clear_errors();
    simplexml_load_string($string);

    return count(libxml_get_errors()) == 0;
}
1 голос
/ 02 июля 2010

Вы пытаетесь запретить пользователям публиковать HTML-теги вместо строк? Потому что если это то, что вы хотите сделать, вам просто нужно striptags ()

Удалит все html-теги из строки.

1 голос
/ 02 июля 2010

Вы можете использовать метод DomDocument loadHTML

0 голосов
/ 17 июля 2014

Если вы также хотите сделать свой сайт безопасным, вам обязательно нужно использовать очиститель HTML, такой как htmlpurifier, tidy и т. Д.

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