2010-01-01 6 views
2

Je voudrais utiliser grep pour savoir si/où une classe html est utilisée à travers un tas de fichiers. Le modèle regex devrait trouver non seulement <p class="foo"> mais aussi <p class="foo bar foo-bar">.Expression régulière pour trouver des noms de classe en HTML

Jusqu'à présent, je suis en mesure de trouver class = « foo » avec cet exemple ci-dessous, ne peut pas le faire fonctionner avec plusieurs noms de classe:

grep -Ern "class=\"result+(\"|)" *

Toutes les suggestions? Merci! Mike

Répondre

1

dépend de ce que Métacaractères vos grep supprts, essayez:

'class = \ "([az] +?) + \"'

14

Que diriez-vous quelque chose comme ceci:

grep -Erno 'class[ \t]*=[ \t]*"[^"]+"' * 

Cela permettra également de plus des espaces et devrait vous donner une sortie similaire à:

1:class="foo bar baz" 
3:class = "haha" 

Pour voir toutes les classes utilisées, vous pouvez sortir de la conduite de ce qui précède dans les éléments suivants:

cut -f2 -d'"' | xargs | sort | uniq 
+0

Le drapeau -o est agréable. Je ne savais pas à ce sujet - bien sûr, bat la commande Perl que j'utilise habituellement pour imprimer la chaîne de match. –

+0

Merci Kaleb! J'enveloppe encore la tête autour de l'expression rationnelle ... Vraiment comme l'utilisation de l'étoile pour "zéro ou plus" des espaces ou des onglets ... alors je n'ai pas besoin d'utiliser ces conditions. Très utile. – Mike

+0

Pour rechercher l'utilisation d'une classe particulière (dans cet exemple "users"): 'grep -Ern 'class [\ t] * = [\ t] *" [^ "] * users [^"] * "' * ' – bjudson

0

Les expressions régulières sont un outil assez pauvre pour l'analyse syntaxique HTML. Essayez de chercher dans simpleXML (http://php.net/manual/en/book.simplexml.php). Roll-your-own regEx sur HTML est suppliant pour le problème.

+0

Voir http://www.codinghorror.com/blog/archives/001311.html – Wim

+0

Trouver un analyseur par exemple ici: http://stackoverflow.com/questions/773340/can-you-provide-an-example-of-parsing-html-with-your-favorite-parser – Svante

+6

Ce n'est pas l'analyse HTML, c'est la correspondance de modèle, ce que expressions régulières où fait pour. –

1

Ne le faites pas. Il vous rendra fou: RegEx match open tags except XHTML self-contained tags

Utilisez plutôt un analyseur HTML. C'est pas difficile.

EDIT: Voici un exemple dans PowerShell

Get-ChildItem -Recurse *.html | where { 
    ([xml](Get-Content $_)).SelectNodes('//*') | where { $_.GetAttribute("class").Contains("foo") } 
} 
+0

Depuis la ligne de commande? Je n'en ai pas encore trouvé. Vous voulez en développer un pour le PO? – slebetman

+1

@slebetman: terminé. –

Questions connexes