2012-05-27 64 views
16

¿Cómo puedo verificar si los contenidos de cadenas PHP contienen algún contenido HTML?¿Cómo comprobar si el contenido de la cadena contiene HTML?

No soy bueno con expresiones regulares así que me gustaría tener una función llamada "is_html" para verificar esto. :) ¡gracias!

+2

¿Qué quiere decir "contenido HTML"? – Sebas

+0

búsqueda rápida de Google apareció http://preprocess.me/comment/91 – mcgrailm

+0

Etiquetas HTML, caracteres HTML específicos como <, >, ", ', = –

Respuesta

25

Si desea probar si una cadena contiene un "<something>", (que es perezoso, pero puede trabajar para usted), puede intentar algo así:

function is_html($string) 
{ 
    return preg_match("/<[^<]+>/",$string,$m) != 0; 
} 

Editar: Deberías echar un vistazo a la respuesta de Kevin Traas justo debajo. su expresión regular probablemente devolverá menos falso positivo.

+2

usando una expresión regular solo para detectar si hay etiquetas presentes es un poco exagerado ... –

+0

¿Sabe de todos modos representar exactamente esta expresión sin una expresión regular? Estoy usando la misma expresión, y curioso de la diferencia de expresiones regulares vs. no expresiones regulares. – onassar

+0

Simple, con clase, buen truco, me gusta. – Kzqai

-2

Eso depende de lo que defina como contenido html.

Lo más sencillo es poner a prueba si la cadena contiene la etiqueta HTML que se puede hacer con la expresión regular

<html.*> 

en PHP la prueba será

if (preg_match('/<html.*>/', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

Si quieres ver tienes un html válido, es mejor usar un analizador html.

+0

Es decir, si tengo etiquetas HTML que contengan caracteres <>, = y comillas de cualquier tipo! –

+2

Hm, la respuesta anterior probará si la etiqueta html está presente – buckley

+0

técnica y pragmáticamente, la etiqueta ya no es necesaria en html5 ... – Kzqai

8

probablemente la forma más fácil sería algo así como:

<?php 

function hasTags($str) 
{ 
    return !(strcmp($str, strip_tags($str)) == 0); 
} 

$str1 = '<p>something with <a href="/some/url">html</a> in.'; 
$str2 = 'a string.'; 

var_dump(hasTags($str1)); // true - has tags. 
var_dump(hasTags($str2)); // false - no tags. 
+1

Esto causa un falso distintivo. Tome la cadena por ejemplo 'I <3 PHP'. Esta función determinaría que las etiquetas no existe, cuando no lo hacen – buggedcom

+0

Hmmm, pero ¿scrcmp error en texto utf-8, como lo hacen muchas funciones de cadena? – Kzqai

1

Esto es lo que ocurrió con

function isHtml($string){ 
    preg_match("/<\/?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/",$string, $matches); 
    if(count($matches)==0){ 
     return FALSE; 
     }else{ 
     return TRUE; 
     } 
} 

Sólo pasa una cadena y comprobar si devuelve verdadero o falso. Tan sencillo como eso.

10

En lugar de utilizar expresiones regulares (al igual que las otras sugerencias aquí) utilizo el siguiente método:

function isHtml($string) 
    { 
     if ($string != strip_tags($string)) 
     { 
      return true; // Contains HTML 
     } 
     return false; // Does not contain HTML 
    } 

Aquí, he utilizado una función PHP strip_tags para eliminar todo el código HTML de la cadena. Luego compara las cadenas y si no coinciden con las etiquetas HTML estaban presentes.

+1

'strlen' no es necesario allí. – Red

+1

Buen punto @Red. He eliminado 'strlen' del código, aunque es mínimo, guarda otro proceso. Gracias por los comentarios constructivos. –

+0

La función nunca devuelve falso – paulo62

5

La respuesta aceptada considerará una cadena que contiene <algo> como HTML que, obviamente, no lo es.

Uso el siguiente, que puede o no ser una mejor idea. (Comentarios apreciados.)

function isHTML($str) { return preg_match("/\/[a-z]*>/i", $str) != 0; } 

Este busca cualquier cadena que contiene /> con cero o más cartas entre la barra y el soporte del cierre.

Las anteriores declaraciones de función:

<something>    is NOT HTML 
<b>foo</b>    is HTML 
<B>foo</B>    is HTML 
<b>foo<b>    is NOT HTML 
<input />    is HTML 
+2

Creo que su expresión regular es mejor. Editaré mi respuesta. – nico

+0

Probablemente usaría '' 'porque' 'no es HTML. De lo contrario, muy buen concepto! – gooli

+0

@gooli - con un '+', no coincidirá con '' – nico

Cuestiones relacionadas