Intereting Posts
Loop MySql INSERT запрос. Пока или Foreach? Как я должен обрабатывать таймауты сервера и ответы на код ошибки на http-сообщение в приложении Android? Laravel – правило валидации max не работает над загруженным изображением URL-адрес redirect_uri должен быть абсолютным facebook Laravel Запрос порядка запросов MySQL по значению в столбце JSON Пожалуйста, критикуйте мои попытки аутентификации PHP PHP: возвращает все даты между двумя датами в массиве Пуля "•" в XML Я должен ДОЛЖЕН обновить свой PHP-SDK от 3.2 до 4.0 после 30 апреля 2015 года (истекает срок действия графика API 1.0)? могу ли я использовать PHP-SDK 3.2 с Graph API 2.0? Форма Html не отправляет данные? как зарегистрировать нового помощника (пользовательский помощник) в zend framework Как отсортировать многомерный массив (PHP)? Включить загрузку файлов для php в Google App Engine Как получить список плагинов в плагине WordPress? Как создать водяной знак изображения wm_type наложения в Codeigniter?

Обнаруживать теги HTML в строке

Мне нужно определить, содержит ли строка HTML-теги.

if(!preg_match('(?<=<)\w+(?=[^<]*?>)', $string)){ return $string; } 

Вышеупомянутое регулярное выражение дает мне ошибку:

 preg_match() [function.preg-match]: Unknown modifier '\' 

Я не очень хорошо разбираюсь в регулярном выражении, поэтому не знаю, в чем проблема. Я попытался убежать от \, и он ничего не сделал.

Есть ли лучшее решение, чем регулярное выражение? Если нет, будет ли правильное регулярное выражение работать с preg_match?

Related of "Обнаруживать теги HTML в строке"

Простое решение:

 if($string != strip_tags($string)) { // contains HTML } 

Преимущество этого над регулярным выражением проще понять, однако я не могу прокомментировать скорость выполнения любого из этих решений.

вам нужно «разграничить» регулярное выражение каким-то другим символом. Попробуй это:

 if(!preg_match('#(?<=<)\w+(?=[^<]*?>)#', $string)){ return $string; } 

Эта функция будет искать определенные html-теги и инкапсулировать их в скобки – что довольно бессмысленно – просто измените ее на все, что вы хотите делать с тегами.

 $html = preg_replace_callback( '|\</?([a-zA-Z]+[1-6]?)(\s[^>]*)?(\s?/)?\>|', function ($found) { if(isset($found[1]) && in_array( $found[1], array('div','p','span','b','a','strong','center','br','h1','h2','h3','h4','h5','h6','hr')) ) { return '[' . $found[0] . ']'; }; }, $html ); 

Объяснение регулярного выражения:

 \< ... \> //start and ends with tag brackets \</? //can start with a slash for closing tags ([a-zA-Z]+[1-6]?) //the tag itself (for example "h1") (\s[^>]*)? //anything such as class=... style=... etc. (\s?/)? //allow self-closing tags such as <br /> 

Я бы использовал strlen() потому что, если вы этого не сделаете, сравнение по-символу будет выполнено, и это может быть медленным, хотя я бы ожидал, что сравнение прекратится, как только оно обнаружит разницу.

Анализ HTML в целом является трудной проблемой, здесь есть хороший материал:

  • Parsing Html Путь Cthulhu
  • Разбор: за пределами регулярного выражения

Но в отношении вашего вопроса («лучшее» решение) – может быть более конкретным в отношении того, что вы пытаетесь достичь, и какие инструменты доступны вам?

Если вы не хорошо разбираетесь в регулярных выражениях (например, я), я нахожу много библиотек регулярных выражений, которые обычно помогают мне выполнить мою задачу.

Вот небольшой учебник, который объяснит, что вы пытаетесь сделать в php.

Вот одна из тех библиотек, о которых я говорил.

Если целью является просто проверить, содержит ли строка html-тег или нет. Не имеют значения теги html или нет. Тогда вы можете попробовать это.

 function is_html($string) { // Check if string contains any html tags. return preg_match('/<\s?[^\>]*\/?\s?>/i', $string); } 

Это работает для всех допустимых или недопустимых тегов html. Вы можете проверить подтверждение здесь https://regex101.com/r/2g7Fx4/3