Ответ 1
Простое решение:
if($string != strip_tags($string)) {
// contains HTML
}
Преимущество этого над регулярным выражением проще понять, однако я не могу прокомментировать скорость выполнения любого решения.
Мне нужно определить, содержит ли строка HTML-теги.
if(!preg_match('(?<=<)\w+(?=[^<]*?>)', $string)){
return $string;
}
Вышеупомянутое регулярное выражение дает мне ошибку:
preg_match() [function.preg-match]: Unknown modifier '\'
Я не очень хорошо разбираюсь в regex, поэтому не знаю, в чем проблема. Я попытался убежать от \, и он ничего не сделал.
Есть ли лучшее решение, чем регулярное выражение? Если нет, правильное регулярное выражение для работы с preg_match?
Простое решение:
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 в целом является трудной проблемой, здесь есть хороший материал:
Но в отношении вашего вопроса ( "лучшее" решение) - может быть более конкретным в отношении того, что вы пытаетесь достичь, и какие инструменты доступны вам?
Если вы не хорошо используете регулярные выражения (например, я), я нахожу много библиотек регулярных выражений, которые обычно помогают мне выполнить мою задачу.
Вот небольшой учебник, который объясняет, что вы пытаетесь сделать в 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