Masque pour preg_match() ... Aidez-moi !

LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009 - 15 nov. 2003 à 08:05
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009 - 21 nov. 2003 à 17:51
Alors, j'expose le problème :
J'ai 1 fichier texte qui contient des ligne du style :
0004 - Chu Chu Rocket (J)

Donc le masque approprié pour séparer les éléments, c'est :
$masque = '/(.*) - (.*) (.*)/'

Le problème, c'est que ça marche si c'est sous la forme précédente, mais si j'ai quelque chose comme ça :
0000 - un titre - avec un tiret (U)

Et bien, y a tout qui foire parce que le compilateur se trompe de tiret ...
J'en ai marre, ça fait plein de fois que j'ai ce problème et je ne trouve pas de solution !
Aidez-moi ... Snif !
LocalStone :big)

6 réponses

LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
15 nov. 2003 à 13:17
Allez, aidez moi ! S'il vous plait ... %-6
LocalStone :big)
0
Tomcube Messages postés 311 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 14 septembre 2004 1
15 nov. 2003 à 15:32
<?
$maligne = "0000 - un titre - avec un tiret (U)";
// par exemple avec la ligne là

$numero = substr($maligne,0,4);
$texte = substr($maligne,7);

?>

Normalement ça devrait marcher parce qu'à mon avis, tes chiffres à gauche ne vont jamais dépasser 4 chiffres. Tu l'a prévenu en mettant "0004" au lieu de "4"
0
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
15 nov. 2003 à 17:27
Oui, c'est vrai que cette solution est envisageable ... Mais même, je ne comprends pas pourquoi ce putain de masque ne fonctionne pas ... Parce que ta solution convient parfaitement pour ce cas, mais par exemple, pour parser l'HTML en PHP et si tu as 2 balises identiques sur la même ligne, ça ne marche pas ... Merci quand même, je vais utiliser ta solution.
LocalStone :big)
0
cs_str Messages postés 20 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 11 mai 2007
19 nov. 2003 à 22:23
Salut,

Ton problème est tout à fait normal.

Le problème que tu as dans ton deuxième exemple est le même que dans le premier.

Explications :

Dans le premier exemple, php arrive à satisfaire la première partie du masque. Il ne peux donc pas retourner d'erreur bien que la présence de plusieurs espace ne lui permette pas de satisfaire la seconde partie du masque.

Dans le second exemple, php n'arrive pas à satisfaire le masque parce qu'il ne peux pas sélectionner un seul des deux tirets.

Il suffit donc que tu utilise des options comme "Uis" par exemple pour faire un masque que tu peux satisfaire.

Après, il faut juste savoir ce que tu veux exactement séparer.

A partir de ça : 0004 - Chu Chu Rocket (J)

si tu veux "0004" et "Chu Chu Rocket (J)" je te conseil d'utiliser la fonction explode avec le masque " - "

si tu veux "0004" et "Chu Chu Rocket" et "(J)" alors là, ça se complique et à cause des espaces, tu va te trouver face à des erreurs à chaque nouvel éléments que tu ne prendra pas en compte dans ton masque comme le point d'intérogation, le point, etc...

Le tiret étant fréquement utilisé dans les caractères de texte, je te conseil le "pipe" | ou "double pipe" || comme séparateur. C'est moins commun et tu peux le remplacer par un autre caractère dans l'éventualité ou il serait insérer dans une ligne de ton fichier (assez rare). C'est une solution qui t'évitera pas mal de désaggréments et te permettra de te faire la main sur les masques.

Les masques et les expressions régulières en général sont très pratiques mais seront plus rapidement exécutées en PERL.

sEe YoU

[StR]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tomcube Messages postés 311 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 14 septembre 2004 1
20 nov. 2003 à 13:02
Ouais, là tu traite le problème à la base, ce qui est très bien. Le tiret étant en effe très commun mieux vaut utiliser les pipes ou l'arobase. Par contre, si son fichier contient déjà 2000 entrées comme celles-ci, je le voit mal changer toutes ces entrées avec une double pipe ou un arobase !
Au fait, est-ce que t'as testé ma solution ?
0
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
21 nov. 2003 à 17:51
Oui ! C'est un peu barbare mais ça à le merite de marcher. J'ai fais la même chose pour la langue puisqu'elle aussi reste invariable. Merci !
LocalStone :big)
0
Rejoignez-nous