8
votes

Comment utiliser une expression régulière pour correspondre à la chaîne de caractères en HTML?

EXEMPLE DE CODE HTML:

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


4 commentaires

Quelle langue utilisez-vous? Ils ont tous des différences subtiles (et non si subtiles) dans leurs dialectes de regex.


Certaines personnes, quand elles sont confrontées à un problème, pensez-moi "que je sais, je vais utiliser des expressions régulières." Maintenant, ils ont deux problèmes. ~ Jamie Zawinski


Si votre exemple HTML est l'intégralité de la chaîne, vous devez analyser, puis regex est OK, mais si votre chaîne est un document HTML entier, la réponse "You's" s'applique.


et certaines personnes, lorsqu'elles sont confrontées à des expressions régulières, pensez-moi "que je sais, je vais utiliser une citation accrocheuse que je me souviens". Maintenant, ils n'ont rien ajouté à la discussion. ~ Tomalak


9 Réponses :


0
votes

J'ai essayé avec JavaScript placer votre chaîne dans une variable et faire une correspondance:

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]);


2 commentaires

Oh non,

paragraphe contenant charset = bogus ! .


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



-2
votes

N'utilisez pas d'expressions régulières pour Analyse (x) HTML ! Utilisez un outil approprié, c'est-à-dire un analyseur SGML ou XML. Votre code ressemble à XHTML, alors j'essaierais un analyseur XML. Après avoir obtenu l'attribut de l'élément méta, cependant; une regex serait plus appropriée. Bien que, juste une scission de chaîne à ; ferait certainement le truc (et plus vite, aussi).


3 commentaires

Il n'a pas analysé tout un document HTML, juste une seule ligne.


Je ne vois pas cela dans la question initiale.


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



0
votes

pour PHP:

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


1 commentaires

-1, à l'aide de Regexps n'est pas une bonne idée. Voir mon commentaire sur la réponse de @zsolti.



10
votes

Cette regex: xxx

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


5 commentaires

Hm ... . Donnez-moi une regex HTML-analysant et je vais le casser.


@Vous c'est un exemple artificiel de non-exemple qui ne se produirait presque jamais dans l'usage du monde réel.


Je suis content de ma dégent de 99,9% du temps. Au fait, vous ne pouvez pas toujours utiliser un analyseur XML car le marquage du monde réel se comporte rarement bien.


+1, bien que je fasse le. * Un groupe de non-capture, de sorte qu'un littéral à chaîne dans c #, ce serait "\\


Si vous gérez XHTML, il devrait être valide XML. Sinon, ce n'est pas xhtml. Dans le cas de HTML, un analyseur SGML sera en mesure de l'analyser, dans autant de cas que cette regex fonctionnera. Sinon plus.



0
votes

J'ai tendance à être d'accord avec @YOU, mais je vais vous donner la réponse que vous demandez plus d'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];


0 commentaires

0
votes

Mon regex: xxx pré>

mon test: p> xxx pré>

c # -code: p> xxx pré >

REGEX-Description: P>

// <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) «*»


1 commentaires

Je vais casser celui-ci aussi, parce que je m'ennuie:



0
votes

Cette expression régulière capturera la valeur de Charset em> provenant de n'importe quelle balise méta: xxx pré>

exemple d'entrée: p> xxx pré>

Utilisez-le comme ceci: p>

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();
} 


0 commentaires

17
votes

Ma réponse fournit une version plus robuste de @ Floyd's et, au degré possible, adresses à l'étui de test de casse de You, où un lookahead négatif est utilisé pour l'éviter. Il n'y a vraiment qu'un seul cas pertinent que je puisse penser (une variante de l'exemple de @ You's) où elle donnera un faux positif, mais je pense que ce serait assez rare. Les expressions devraient être exécutées avec le drapeau insensible à la casse et ont été testés avec java.util.regex et Jregex .

Groupes de capture sont automatiquement coupés et n'incluent jamais de citations, ni d'autres caractères d'étiquette comme "/" ou ">". Dans la deuxième expression, il y a 2 groupes de capture; Le premier étant la valeur de type de contenu, qui peut être vide (c'est-à-dire lors de l'utilisation de l'attributation Charset) et la deuxième valeur de caractères, qui sera toujours non vide (à moins que la valeur boisage ne soit littéralement laissée à vide pour une raison quelconque ).

Regex pour la correspondance / regroupement de la valeur Charset uniquement - coupé, sauté des guillemets xxx

identique que ci-dessus, mais aussi des correspondances / groupes de contenu ( Facultatif) et Charset (requis) Valeurs, coupées, Skips citations. Minor Minor Company - Misses correspondant à la valeur de type de contenu autonome, c'est-à-dire, "Text / html" xxx

cas de test (tout passe à l'exception du dernier) ... xxx


0 commentaires

0
votes

Essayez aussi:

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


0 commentaires