2009-03-22 6 views
0

Si j'avais une div en HTML qui avait class = "blah user_foo", quelle était la regex de Match() pour obtenir le bit "foo"?Aide de Regex

+0

@givp: J'accepterais la réponse de Gumbo au lieu de la mienne ... –

Répondre

1
/<div\s(?:[^>'"]*|".*?"|'.*?')*?\bclass\s*=\s*"blah user_(.*?)"/i 

Les poignées au-dessus des espaces; et d'autres choses avant la spécification de la classe.

Il ne gère pas le cas où class='single-quoted-something'; vous pourriez le faire avec une référence arrière. Il ne gère pas non plus le HTML malformé.

2

Si l'attribut class est le seul attribut des voulu div éléments et la valeur class a toujours la structure mentionnée (fixe blah puis user_foobar), vous pouvez utiliser cette expression régulière:

<div\s+class\s*=\s*"blah user_([^"\s]+) 

Sinon, essayez cette expression régulière:

<div\s+(?:[^>"']+|"[^"]*"|'[^']*')*\bclass\s*=\s*"blah user_([^"\s]+) 

L'expression (?:[^>"']+|"[^"]*"|'[^']*')* prend également en compte qu'un > est autorisé en tant que valeur d'attribut.

Modifier optimisé l'expression régulière avec une affirmation d'anticipation pour réduire retours en arrière:

<div\s+(?:(?:(?!class)[^>"']+(?:"[^"]*"|'[^']*')?)\s+)*class\s*=\s*"blah user_([^"\s]+) 
1

Je ne suis pas sûr quelle langue utilise match(), mais il sera probablement quelque chose comme ceci:

<div[^>]+class="blah user_([^"]+)" 

Selon la langue, « foo » peuvent être stockés dans \ 1, ou 1 $ ou quelque chose d'autre entièrement.

+0

Les valeurs d'attribut peuvent contenir des caractères '' 'simples'. – Gumbo

+0

Je vois ce que vous voulez dire. Votre solution résout ce problème. Je vais voter. – Stephan202