2012-05-27 15 views
16

Wie kann ich überprüfen, ob der PHP-String-Inhalt irgendwelche HTML-Inhalte enthält?Wie überprüft man, ob der String-Inhalt HTML enthält?

Ich bin nicht gut mit regulären Ausdrücken, also würde ich gerne eine Funktion namens "is_html" haben, um dies zu überprüfen. :) Danke!

+2

was meinst du mit "html Inhalt"? – Sebas

+0

schnelle Google-Suche aufgetaucht http://preprocess.me/comment/91 – mcgrailm

+0

HTML-Tags, spezifische HTML-Zeichen wie <, >, ", ', = –

Antwort

25

Wenn Sie testen möchten, ob ein String eine "<something>" enthält, (was faul ist, aber für Sie arbeiten kann), können Sie so etwas versuchen:

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

Bearbeiten: Sie sollten sich Kevin Traas Antwort direkt unten ansehen. Seine Regex wird wahrscheinlich weniger falsch positive Ergebnisse liefern.

+2

mit einem Regex nur um festzustellen, ob irgendwelche Tags vorhanden sind, ist ein bisschen zu viel ... –

+0

Sie wissen, wie auch immer genau diesen Ausdruck ohne Regex darstellen? Ich benutze den gleichen Ausdruck und bin neugierig auf den Unterschied zwischen Regex und Nicht-Regex. – onassar

+0

Einfach, nobel, netter Hack, mag ich. – Kzqai

-2

Das hängt davon ab, was Sie als HTML-Inhalt definieren.

Die einfachste Sache ist, zu testen, ob die Zeichenfolge mit dem HTML-Tag enthält, die mit der Regex getan werden kann

<html.*> 

in PHP den Test

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

sein wird, wenn Sie sehen möchten, Sie haben gültiges HTML, es ist besser, einen HTML-Parser zu verwenden.

+0

Ich meine, wenn ich irgendwelche HTML-Umbauten habe, die chars <>, = und Anführungszeichen von Anykind enthalten! –

+2

Hm, die Antwort oben testet, ob das html-Tag vorhanden ist – buckley

+0

Technisch und pragmatisch ist das -Tag in html5 nicht mehr erforderlich ... – Kzqai

8

wahrscheinlich der einfachste Weg wäre so etwas wie:

<?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

Das führt zu falschen Flags.Nehmen Sie den String zum Beispiel 'I <3 PHP' Diese Funktion würde bestimmen, dass Tags dies tun existieren, wenn sie es nicht tun. – buggedcom

+0

Hmmm, aber wird Scrcmp Fehler auf UTF-8-Text, wie viele String-Funktionen tun? – Kzqai

1

Hier ist, was ich kam mit

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

Sie haben soeben einen String übergeben und überprüfen, ob es wahr oder falsch zurückgibt. So einfach ist das.

10

Statt regex verwenden (wie auch die anderen Vorschläge hier) Ich verwende die folgende Methode:

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

Hier verwende ich eine PHP-Funktion strip_tags beliebigen HTML aus dem String zu entfernen. Es vergleicht dann die Zeichenfolgen und wenn sie nicht übereinstimmen, waren HTML-Tags vorhanden.

+1

'strlen' ist dort nicht notwendig. – Red

+1

Guter Punkt @Rot. Ich habe 'strlen' aus dem Code entfernt, obwohl es minimal einen anderen Prozess speichert. Danke für die konstruktive Rückmeldung. –

+0

Die Funktion gibt niemals false zurück – paulo62

5

Die akzeptierte Antwort wird eine Zeichenfolge mit <etwas> als HTML betrachten, die offensichtlich nicht ist.

Ich benutze die folgenden, die eine bessere Idee sein können oder nicht. (Kommentare zu schätzen.)

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

Diese für jede Saite sieht enthalten /> mit null oder mehr Buchstaben zwischen dem Schrägstrich und Schließbügel.

Die obige Funktion gibt:

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

Ich denke, Ihre Regex ist besser. Ich werde meine Antwort bearbeiten. – nico

+0

Ich würde wahrscheinlich ein '+' dort verwenden, weil '' nicht HTML ist. Ansonsten sehr cooles Konzept! – gooli

+0

@gooli - mit einem '+' passt es nicht '' – nico