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