2010-08-11 4 views
8

exemple de code HTML:Comment utiliser Regular Expression pour faire correspondre la chaîne charset en HTML?

<meta http-equiv="Content-type" content="text/html;charset=utf-8" /> 

Je veux utiliser RegEx pour extraire les informations charset (c.-là, il est "utf-8")

(je suis en utilisant C#)

+0

Quelle langue utilisez-vous? Ils ont tous des différences subtiles (et pas si subtiles) dans leurs dialectes RegEx. – Oded

+4

'Certaines personnes, lorsqu'elles sont confrontées à un problème, pensent" je sais, j'utiliserai des expressions régulières ". Maintenant, ils ont deux problèmes. »~ Jamie Zawinski –

+0

si votre exemple html est l'intégralité de la chaîne que vous avez à analyser, alors regex est ok, mais si votre chaîne est un document html entier, la réponse« You's »s'applique. – Benjol

Répondre

6

Ce regex:

<meta.*?charset=([^"']+) 

devrait fonctionner. L'utilisation d'un analyseur XML pour extraire ce est overkill.

+0

Hm ... ' '. Donnez-moi une regex HTML-analyse, et je vais le casser. – You

+0

@You Ceci est un non-exemple artificiel qui ne se produirait presque jamais dans un usage réel. – NullUserException

+0

Je suis content que mon regex travaille 99,9% du temps. À propos, vous ne pouvez pas toujours utiliser un analyseur XML car le balisage réel est rarement correct. – NullUserException

0

I essayé avec javascript placer votre chaîne dans une variable et faire un match:

var x = '<meta http-equiv="Content-type" content="text/html;charset=utf-8" />'; 
var result = x.match(/charset=([a-zA-Z0-9-]+)/); 
alert(result[1]); 
+1

Oh non,'

Un paragraphe contenant charset=bogus!

'. – You

+0

Eh bien, correct. J'ai considéré la chaîne contenant uniquement la balise . – Zsolti

-1

Don't use regular expressions to parse (X)HTML! Utilisez un outil approprié, c'est-à-dire un analyseur SGML ou XML. Votre code ressemble à XHTML, donc j'essaierais un analyseur XML. Après avoir obtenu l'attribut de l'élément meta, cependant; une regex serait plus appropriée. Bien, juste une fente de chaîne à ; ferait certainement l'affaire (et plus vite, aussi).

+0

Il n'analyse pas un document HTML entier, juste une seule ligne. – Oded

+0

Je ne vois pas cela dans la question initiale. –

+1

Ne dit pas ça n'importe où. Et la règle "no regex" s'applique toujours, même aux lignes simples; (X) HTML n'est pas une grammaire régulière et ne peut pas être analysé en utilisant des expressions régulières. – You

0

Pour PHP:

$charset = preg_match('/charset=([a-zA-Z0-9-]+)/', $line); 
$charset = $charset[1];
+1

-1, en utilisant regexps n'est pas une bonne idée. Voir mon commentaire sur la réponse par @Zsolti. – You

0

J'ai tendance à être d'accord avec @You mais je vais vous donner la réponse que vous demandez plus quelques autres solutions.

 String meta = "<meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" />"; 
     String charSet = System.Text.RegularExpressions.Regex.Replace(meta,"<meta.*charset=([^\\s'\"]+).*","$1"); 

     // if meta tag has attributes encapsulated by double quotes 
     String charSet = ((meta.Split(new String[] { "charset=" }, StringSplitOptions.None))[1].Split('"'))[0]; 
     // if meta tag has attributes encapsulated by single quotes 
     String charSet = ((meta.Split(new String[] { "charset=" }, StringSplitOptions.None))[1].Split('\''))[0]; 

De toute façon l'un des ci-dessus devrait travailler, cependant certainement les commandes string.split peuvent être dangereux sans d'abord vérifier si le tableau contient des données, donc peut vouloir sortir ci-dessus sinon vous aurez une exception NullException

0

Mon regex:

<meta[^>]*?charset=([^"'>]*) 

Mon testcase:

<meta http-equiv="Content-type" content="text/html;charset=utf-8" /> 
<meta name="author" value="me"><!-- Maybe we should have a charset=something meta element? --><meta charset="utf-8"> 

C# -Code:

using System.Text.RegularExpressions; 
string resultString = Regex.Match(sourceString, "<meta[^>]*?charset=([^\"'>]*)").Groups[1].Value; 

RegEx-Description:

// <meta[^>]*?charset=([^"'>]*) 
// 
// Match the characters "<meta" literally «<meta» 
// Match any character that is not a ">" «[^>]*?» 
// Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?» 
// Match the characters "charset=" literally «charset=» 
// Match the regular expression below and capture its match into backreference number 1 «([^"'>]*)» 
// Match a single character NOT present in the list ""'>" «[^"'>]*» 
//  Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
+0

Je vais aussi le casser, parce que je m'ennuie: ' ' – You

0

Cette expression régulière capturera le charset valeur lui-même de toute balise meta:

(?<=([<META|<meta])(.*)charset=)([^"'>]*) 

entrée Exemple:

<meta http-equiv=Content-Type content="text/html; charset=windows-1252"> 
<meta http-equiv=Content-Type content=text/html; charset=windows-1252> 
<meta http-equiv=Content-Type content='text/html; charset=windows-1252'> 
<meta http-equiv="Content-type" content="text/html;charset=utf-8" /> 
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" /> 

utiliser comme ceci:

Regex regexObj = new Regex("(?<=<meta(.*)charset=)([^\"'>]*)", RegexOptions.IgnoreCase); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    for (int i = 1; i < matchResults.Groups.Count; i++) { 
     Group groupObj = matchResults.Groups[i]; 
     if (groupObj.Success) { 
      // matched text: groupObj.Value 
      // match start: groupObj.Index 
      // match length: groupObj.Length 
     } 
    } 
    matchResults = matchResults.NextMatch(); 
} 

trouverez ces valeurs:

windows-1252

windows-1252

windows-1252

utf-8

iso-8859-1

14

Ma réponse fournit une version plus robuste de @ Floyd et, dans la mesure du possible, les adresses @ Vous de cas de test de rupture, où un lookahead négatif est utilisé pour l'éviter. Il y a vraiment un seul cas auquel je peux penser (une variante de l'exemple de @ You) où il donnera un faux positif, mais je pense que ce serait plutôt rare. Les expressions doivent être exécutées avec le drapeau insensible à la casse et ont été testées en utilisant java.util.regex et JRegex.

Les groupes de capture sont automatiquement rognés et n'incluent jamais de guillemets, ni d'autres caractères comme "/" ou ">". Dans la deuxième expression, il y a deux groupes de capture; la première étant la valeur de type content, qui peut être vide (ie, en utilisant charset attribtue), et la seconde étant la valeur charset, qui sera toujours non vide (sauf si la valeur charset est littéralement laissée vide pour une raison étrange)).

regex pour/regroupement valeur charset uniquement - parés, Sauts citations

<meta(?!\s*(?:name|value)\s*=)[^>]*?charset\s*=[\s"']*([^\s"'/>]*) 

comme ci-dessus, mais correspond aussi/groupes type de contenu (en option) et charset (requis) valeurs, parées, saute citations . mise en garde mineure - Misses correspondant à la valeur de type de contenu autonome, à savoir, "text/html"

<meta(?!\s*(?:name|value)\s*=)(?:[^>]*?content\s*=[\s"']*)?([^>]*?)[\s"';]*charset\s*=[\s"']*([^\s"'/>]*) 

des cas de test (tous sauf passe le tout dernier) ...

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/> 
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> 
<meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1'/> 
<meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1' /> 
<meta http-equiv=Content-Type content=text/html;charset=iso-8859-1/> 
<meta http-equiv=Content-Type content=text/html;charset=iso-8859-1 /> 
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" > 
<meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1'> 
<meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1' > 
<meta http-equiv=Content-Type content=text/html;charset=iso-8859-1> 
<meta http-equiv=Content-Type content=text/html;charset=iso-8859-1 > 

<meta http-equiv="Content-Type" content="text/html;charset='iso-8859-1'"> 
<meta http-equiv="Content-Type" content="'text/html;charset=iso-8859-1'"> 
<meta http-equiv="Content-Type" content="'text/html';charset='iso-8859-1'"> 
<meta http-equiv='Content-Type' content='text/html;charset="iso-8859-1"'> 
<meta http-equiv='Content-Type' content='"text/html;charset=iso-8859-1"'> 
<meta http-equiv='Content-Type' content='"text/html";charset="iso-8859-1"'> 

<meta http-equiv="Content-Type" content="text/html;;;charset=iso-8859-1"> 
<meta http-equiv="Content-Type" content="text/html;;;charset='iso-8859-1'"> 
<meta http-equiv="Content-Type" content="'text/html;;;charset=iso-8859-1'"> 
<meta http-equiv="Content-Type" content="'text/html';;;charset='iso-8859-1'"> 
<meta http-equiv='Content-Type' content='text/html;;;charset=iso-8859-1'> 
<meta http-equiv='Content-Type' content='text/html;;;charset="iso-8859-1"'> 
<meta http-equiv='Content-Type' content='"text/html;;;charset=iso-8859-1"'> 
<meta http-equiv='Content-Type' content='"text/html";;;charset="iso-8859-1"'> 

<meta http-equiv = " Content-Type " content = " ' text/html ' ; ;; ' ; ' ' ; ' ; ' ;; ; charset = ' iso-8859-1 ' " > 
<meta content = " ' text/html ' ; ;; ' ; ' ' ; ' ; ' ;; ; charset = ' iso-8859-1 ' " http-equiv = " Content-Type " > 
<meta http-equiv = Content-Type content = text/html;charset=iso-8859-1 > 
<meta content = text/html;charset=iso-8859-1 http-equiv = Content-Type > 
<meta http-equiv = Content-Type content = text/html ; charset = iso-8859-1 > 
<meta content = text/html ; charset = iso-8859-1 http-equiv = Content-Type > 
<meta http-equiv = Content-Type content = text/html ;;; charset = iso-8859-1 > 
<meta content = text/html ;;; charset = iso-8859-1 http-equiv = Content-Type > 
<meta http-equiv = Content-Type content = text/html ; ; ; charset = iso-8859-1 > 
<meta content = text/html ; ; ; charset = iso-8859-1 http-equiv = Content-Type > 

<meta charset="utf-8"/> 
<meta charset="utf-8" /> 
<meta charset='utf-8'/> 
<meta charset='utf-8' /> 
<meta charset=utf-8/> 
<meta charset=utf-8 /> 
<meta charset="utf-8"> 
<meta charset="utf-8" > 
<meta charset='utf-8'> 
<meta charset='utf-8' > 
<meta charset=utf-8> 
<meta charset=utf-8 > 

<meta charset = " utf-8 " > 
<meta charset = ' utf-8 ' > 
<meta charset = " utf-8 ' > 
<meta charset = ' utf-8 " > 
<meta charset = " utf-8  > 
<meta charset = ' utf-8  > 
<meta charset =  utf-8 ' > 
<meta charset =  utf-8 " > 
<meta charset =  utf-8  > 
<meta charset =  utf-8 /> 

<meta name="title" value="charset=utf-8 — is it really useful (yep)?"> 
<meta value="charset=utf-8 — is it really useful (yep)?" name="title"> 
<meta name="title" content="charset=utf-8 — is it really useful (yep)?"> 
<meta name="charset=utf-8" content="charset=utf-8 — is it really useful (yep)?"> 

<meta content="charset=utf-8 — is it really useful (nope, not here, but gotta admit pretty robust otherwise)?" name="title"> 
0

Essayez aussi:

<meta(?!\s*(?:name|value)\s*=)[^>]*?charset\s*=[\s"']*([a-zA-Z0-9-]+)[\s"'\/]*> 
Questions connexes