2010-02-08 9 views
2

Je suis en train d'écrire une expression régulière pour capturer cette chaîne:expression régulière pour correspondre balise html avec un contenu spécifique

<td style="white-space:nowrap;">###.##</td> 

Je ne peux pas correspondre même si inclure la chaîne comme dans le modèle de regex ! J'utilise preg_match_all(), cependant, je ne trouve pas le modèle correct. Je pense que "white-space:nowrap;" rejette l'appariement d'une manière ou d'une autre. Une idée? Merci ...

+0

@ user268851 Il suffit de mettre en retrait 4 espaces et le rendu sera correct. J'ai supprimé le lien vers votre image, et j'ai rajouté le code HTML à votre question. –

+4

bien quelle est la regex que vous utilisez? – prodigitalson

+0

Cette regex devrait le faire: '\ Q ###. ## \ E';) –

Répondre

1

Avez-vous vu des avertissements? Vous devez échapper à certains bits de cela, à savoir le / avant la balise de fermeture td. Cela a semblé fonctionner pour moi:

$string='cow cow cow <td style="white-space:nowrap;">###.##</td> cat cat cat cat'; 
php > preg_match_all('/<td style="white-space:nowrap;">###\.##<\/td>/',$string,$result); 
php > var_dump($result); 
array(1) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(43) "<td style="white-space:nowrap;">###.##</td>" 
    } 
} 
4

Pourquoi ne pas essayer d'utiliser le document DOM à la place? Ensuite, vous n'avez pas à vous soucier d'avoir le format HTML correctement. L'utilisation de la collection Dom Doc améliore également la lisibilité et garantit des performances rapides puisque sa partie du noyau PHP réside plutôt dans l'espace utilisateur

+1

D'accord, c'est une meilleure idée de ne pas parser HTML avec des expressions régulières et utilisez plutôt http://php.net/manual/fr/class.domdocument.php – JAL

1

Etes-vous conscient que l'argument regex de l'une des fonctions preg_ de PHP doit être délimité par deux? Par exemple:

preg_match_all(`'/foo/'`, $target, $results) 

'...' sont les cordes délimiteurs, /.../ sont les regex délimiteurs et le regex est foo. Les délimiteurs de regex n'ont pas besoin d'être des barres obliques, ils doivent simplement correspondre; certains choix populaires sont #...#, %...% et ~...~. Ils peuvent également être des paires équilibrées de caractères entre parenthèses, comme {...}, (...), [...] et <...>; ceux-ci sont beaucoup moins populaires et pour une bonne raison.

Si vous omettez les délimiteurs de regex, la phase de compilation de regex échouera probablement et le message d'erreur n'aura probablement aucun sens. Par exemple, ce code:

preg_match_all('<td style="white-space:nowrap;">###.##</td>', $s, $m) 

... générerait ce message:

Unknown modifier '#' 

Il tente d'utiliser la première paire de crochets comme délimiteurs regex, et tout ce qui suit le > comme modificateurs de regex (par exemple, i pour insensible à la casse, m pour la multiligne). Pour résoudre ce problème, vous devez ajouter vrais délimiteurs regex, comme ceci:

preg_match_all('%<td style="white-space:nowrap;">###\.##</td>%i', $s, $m) 

Le choix de delimiter est une question de préférence personnelle et de commodité. Si j'avais utilisé # ou /, j'aurais dû échapper à ces caractères dans la regex réelle. J'ai échappé au . parce que c'est un méta-caractère regex.Enfin, j'ai ajouté le modificateur i pour démontrer l'utilisation des modificateurs et parce que le code HTML n'est pas sensible à la casse.

Questions connexes