2011-04-07 3 views
3

comment puis-je supprimer, avec NSRegularExpression, l'en-tête entier dans un fichier HTML. Quelqu'un peut-il me donner une regex?Regex pour supprimer HTML-head-tag

Merci à l'avance, Ph99Ph

+0

@Don: http://meta.stackexchange.com/questions/73133/ –

+0

balle @ Matt: point pris –

Répondre

12

Il n'y a pas! HTML est un langage de type 2 et donc non parable avec une expression régulière (type-3).

Voir this wiki article en cas de doute.

Beaucoup de gens utilisent regex pour analyser/éditer du HTML. Cela fonctionne très bien dans des cas simples, mais est tout à fait sujet à erreur.

Ceci dit: Vous devriez avoir des résultats assez fiables avec cette regex:

<head>.+?</head> 

Cela nécessite "" pour faire correspondre les sauts de ligne. Si elle ne le fait pas, utilisez ceci:

<head>(?:.|\n|\r)+?</head> 

Encore une fois: Ceci est sujette aux erreurs, ne le faites pas.

Qu'est-ce vous devez utiliser est un analyseur XML tels que NSXMLParser.

+0

Cela explique pourquoi mes ceux ne fonctionnaient pas. Merci. – Ph99Ph

+2

Pour être juste, c'est une idée fausse commune endossée en particulier par le gaspillage d'articles en ligne mal informés sur l'analyse/validation/modification html avec regex. Je ne peux que recommander de tout coeur de lire l'article wiki que j'ai aimé dans ma réponse. Comprendre la complexité de la langue est une grande chose. Fondamentalement omniprésent en informatique/programmation. Ça vaut le coup de lire. – Regexident

+0

Pour faire correspondre les sauts de ligne, un modificateur peut être utilisé:/. * <\/head>/s –

4

Veuillez voir la réponse acceptée au RegEx match open tags except XHTML self-contained tags. Ou n'importe quelle version de cette même question affichée chaque jour depuis le début de Stack Overflow. En bref, vous ne pouvez pas analyser de façon fiable le HTML avec des expressions régulières. En bref, vous ne pouvez pas analyser le code HTML de manière fiable. RegEx n'est simplement pas assez avancé en raison des complexités du langage HTML.

0

utiliser quelque chose comme ceci:

result = System.Text.RegularExpressions.Regex.Replace(result, 
     @"<()*head([^>])*>", "<head>", 
     System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
result = System.Text.RegularExpressions.Regex.Replace(result, 
     @"(<()*(/)()*head()*>)", "</head>", 
     System.Text.RegularExpressions.RegexOptions.IgnoreCase);     
result = System.Text.RegularExpressions.Regex.Replace(result, 
     "(<head>).*(</head>)", " ", 
     System.Text.RegularExpressions.RegexOptions.IgnoreCase);