Как проверить, есть ли в содержимом строки HTML-код?
Как я могу проверить, содержит ли содержимое строки PHP какое-либо содержимое HTML?
Я плохо разбираюсь в регулярных выражениях, поэтому мне нужна функция с именем » is_html «, чтобы это проверить. 🙂 Спасибо!
Что должна возвращать функция is_html() для следующих строк: (1) «I think that 12<20." (2) "#*D<#(@>» (3) «this=that» (4) «hellobob»20.">
6 ответов
Если вы хотите проверить, содержит ли строка «» (это лениво, но может сработать для вас), вы можете попробовать что-то вроде этого:
function is_html($string) < return preg_match("/<[^<]+>/",$string,$m) != 0; >
Вы знаете, как представить именно это выражение без регулярного выражения? Я использую одно и то же выражение, и мне интересно узнать разницу между регулярным выражением и нерегулярным выражением.
— не совсем. Возьмем, к примеру, I
Вместо использования регулярного выражения (как и другие предложения здесь) я использую следующий метод:
function isHtml($string) < if ( $string != strip_tags($string) ) < return true; // Contains HTML >return false; // Does not contain HTML >
Здесь я использую функцию PHP strip_tags для удаления любого HTML из строки. Затем он сравнивает строки и, если они не соответствуют, присутствовали теги HTML.
Хороший вопрос @Red. Я удалил strlen из кода, хоть он и минимален, но сохраняет другой процесс. Спасибо за конструктивный отзыв.
Я проверяю, возвращает ли метод true . При необходимости можно легко поставить else. Хотя я обновил его.
strip_tags в большинстве случаев слишком агрессивен. Строка the value is
Вероятно, самым простым способом было бы что-то вроде:
$str1 = 'something with html in.'; $str2 = 'a string.'; var_dump( hasTags( $str1 ) ); // true - has tags. var_dump( hasTags( $str2 ) ); // false - no tags.
Это вызывает ложные флаги. Возьмем, к примеру, строку I
function isHtml($string)< preg_match("/\s]+))?)+\s*|\s*)\/?>/",$string, $matches); if(count($matches)==0)< return FALSE; >else < return TRUE; >>
Вы просто передаете строку и проверяете, возвращает ли она истину или ложь. Так просто.
Это зависит от того, что вы определяете как HTML-содержимое.
Самый простой способ — проверить, содержит ли строка тег html, что можно сделать с помощью регулярного выражения
if (preg_match('//', $subject)) < # Successful match >else
Если вы хотите убедиться, что у вас есть действующий html, лучше использовать html-анализатор.
В принятом ответе строка, содержащая , будет рассматриваться как HTML, что, очевидно, не так.
Я использую следующее, что может быть, а может и не быть лучшей идеей. (Комментарии приветствуются.)
function isHTML( $str ) < return preg_match( "/\/[a-z]*>/i", $str ) != 0; >
Это ищет любую строку, содержащую/> с нулем или более букв между косой чертой и закрывающей скобкой.
Вышеупомянутая функция возвращает:
is NOT HTML foo is HTML foo is HTML foo is NOT HTML is HTML
Обнаруживать теги HTML в строке
Я не очень хорошо разбираюсь в регулярном выражении, поэтому не знаю, в чем проблема. Я попытался убежать от \, и он ничего не сделал.
Есть ли лучшее решение, чем регулярное выражение? Если нет, будет ли правильное регулярное выражение работать с preg_match?
Related of «Обнаруживать теги HTML в строке»
if($string != strip_tags($string)) < // contains HTML >
Преимущество этого над регулярным выражением проще понять, однако я не могу прокомментировать скорость выполнения любого из этих решений.
вам нужно «разграничить» регулярное выражение каким-то другим символом. Попробуй это:
Эта функция будет искать определенные html-теги и инкапсулировать их в скобки – что довольно бессмысленно – просто измените ее на все, что вы хотите делать с тегами.
$html = preg_replace_callback( '|\?([a-zA-Z]+1?)(\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?) //the tag itself (for example "h1") (\s[^>]*)? //anything such as style=. etc. (\s?/)? //allow self-closing tags such as
Я бы использовал strlen() потому что, если вы этого не сделаете, сравнение по-символу будет выполнено, и это может быть медленным, хотя я бы ожидал, что сравнение прекратится, как только оно обнаружит разницу.
Анализ HTML в целом является трудной проблемой, здесь есть хороший материал:
Но в отношении вашего вопроса («лучшее» решение) – может быть более конкретным в отношении того, что вы пытаетесь достичь, и какие инструменты доступны вам?
Если вы не хорошо разбираетесь в регулярных выражениях (например, я), я нахожу много библиотек регулярных выражений, которые обычно помогают мне выполнить мою задачу.
Вот небольшой учебник, который объяснит, что вы пытаетесь сделать в php.
Вот одна из тех библиотек, о которых я говорил.
Если целью является просто проверить, содержит ли строка html-тег или нет. Не имеют значения теги html или нет. Тогда вы можете попробовать это.
function is_html($string) < // Check if string contains any html tags. return preg_match('/<\s?[^\>]*\/?\s?>/i', $string); >
Поиск тегов HTML в строке
У меня есть string и эта строка действительна HTML. Теперь я хочу найти все теги с определенным name и attribute .
Я пробовал это регулярное выражение (т. Е. Div с типом): /()/ .
Do not match me match me not me match me too
Если я использую preg_match, тогда я получаю только
что логично, потому что у другого есть атрибуты в другом порядке.
Какое регулярное выражение мне нужно, чтобы получить следующий array при использовании preg_match в строке примера ?:
array(0 => ' match me', 1 => ' match me too')
Общий совет: не используйте регулярное выражение для анализа HTML. Это будет беспорядочно, если HTML изменится.
DOMDocument этого используйте DOMDocument :
$str = Do not match me