Aller au contenu

probleme de regex


joboy84

Sujets conseillés

Bonjour,

Je souhaite, lors de la soumission d'un formulaire, récupérer uniquement les données du type :

onmouseover="Tip('<strong>Ciane Bau<br>Member GV: 205<br>Home Phone:+33200000009280<br>Email: trd974_AT_gail.com<br>Enroller: Dier Herez<br>Enroller GV: 1160<br>Enroller Email: <a href=mailto:djxxm27_AT_yoo.fr>djxxm27_AT_yoo.fr</a><br>Enroller Phone: +3300000528br><br>Click to view more details</strong>', BALLOON, true, ABOVE, true);return false" onmouseout="UnTip()">

J'ai donc pensé aux regex...en disant que les données doivent commencer par : onmouseover="Tip('<strong> et se termine par onmouseout="UnTip()">

<?php
while($ok = preg_match("#^onmouseover=\"Tip\(\'\<strong\>([a-zA-Z0-9_-.<>]{1,})onmouseout=\"UnTip\(\)\"\>$#", $data2))
{
echo "$ok <br>";;
}

?>

Mais cela renvoie

Warning: preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 44

svp aidez moi !

Lien vers le commentaire
Partager sur d’autres sites

Comme "-" désigne une "range" (comme A-Z), "_-." désigne "les caractères dont le code ASCII est compris entre _ et .". Or "." a un code ASCII inférieur à "_", donc ça couine. Et de toutes façons ce n'est pas ce que tu veux.

La bonne solution: dans une classe (quelque chose entre []), si tu veux inclure "-", il faut toujours le mettre au début.

Tant qu'on y est:

- le ^ et le $ impliquent que $data2 commence effectivement par onmouseover et finisse par UnTip()">, je ne suis pas sûr que ce soit effectivement ce que tu veux

- "{1,}" peut s'écrire "+", c'est quand même plus simple

- si tu utilises ' comme délimiteur pour ta chaîne, tu n'auras pas besoin d'escaper les ", ça fait trois \ de moins, c'est toujours ça de pris en lisibilité

- ta classe n'acceptera pas les caractères accentués. Tu peux avoir envie d'utiliser \w à la place de a-zA-Z0-9, c'est plus large. Ou carrément [^']+ pour tout prendre jusqu'au ' qui suit

- il te manque des choses avant le onmouseout, ta regex ne matchera jamais

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Bonjour :)

Alors j'ai testé en prenant en considération les remarques...

J'ai fait :

<?php
$data2 = 'Code source d une page html';

// extraction de la partie souhaité
$pattern = preg_match_all('#id=[0-9]{9}" onmouseover="Tip\(\'<strong>[^\']+#i',$data2,$match2);

if ($pattern)
{
//On liste les résultats
foreach($match2[0] as $resultat)
{
echo "Extraction : ", $resultat, "\n <br>";
}
}
?>

Cela m'extrait bien :

id=100000028" onmouseover="Tip('<strong>Ciane Bau<br>Member GV: 205<br>Home Phone:+33200000009280<br>Email: trd974_AT_gail.com<br>Enroller: Dier Herez<br>Enroller GV: 1160<br>Enroller Email: <a href=mailto:djxxm27_AT_yoo.fr>djxxm27_AT_yoo.fr</a><br>Enroller Phone: +3300000528br><br>Click to view more details</strong>

Super cool ca marche :)

Sinon, je suis ok pour utiliser le simple quote en tant que délimiteur de chaîne, mais comment faire pour que dans mon texte (code source $data2) cela les échappe automatiquement ?

Ensuite, je souhaite récupérer les données correspondant à :

id=100000028 (juste les chiffres)

Ciane Bau

Home Phone:+33200000009280 (juste le numéro)

Member GV: 205 (juste les chiffres)

Email: trd974_AT_gail.com (juste le mail)

Enroller Email: <a href=mailto:djxxm27_AT_yoo.fr (juste le mail)

Enroller GV: 1160 (juste le nombre

Comment puis je faire cela?

Merci

Modifié par joboy84
Lien vers le commentaire
Partager sur d’autres sites

Ben si le format est fixe:

'#id=([0-9]+)" onmouseover="Tip\(\'<strong>([^<]+)<br>Member GV:\s*([0-9]+)<br>Home Phone:([^<]+)etc.

Tu récupères ensuite chaque partie entre () dans $match2[1] (l'id), $match[2] (le nom), etc.

Il est temps de lire la doc: http://php.net/manual/en/function.preg-match-all.php :-)

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...