Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Эта функция будет искать определенные теги 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 />

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Вот одна из этих библиотек. Я имел в виду.

Ответ 7

Если цель состоит в том, чтобы проверить, содержит ли строка 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