pattern pour pre_match

marih
Invité n'ayant pas de compte PHPfrance

10 nov. 2011, 15:32

Bonjour,
je n'arrive pas à coder le "pattern" nécessaire à la recherche suivante en utilisant "pre_match".
Je souhaite récupérer le nom de l'image ( nom.jpg) contenu dans un fichier et disponible dans :

<img src="nom.jpg" width=....>

Quelqu'un peut me coder ou me donner un exemple voisin du "pattern" nécessaire ?
Merci d'avance

Mammouth du PHP | 672 Messages

10 nov. 2011, 16:24

Bonjour.

Essaye une recherche sur Google :mrgreen:

Perso, dès la première page j'ai un lien qui détaille le pattern à utiliser !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 nov. 2011, 16:26

salut ,

essai preg_match('#<img(.*)src="(.*)" (.*)>#is',$text);
pour l'utilisation de preg_match => http://php.net/preg_match

un "testeur" d'expression régulière http://www.gskinner.com/RegExr/ qui propose pas mal de motif (attention aux flag qui sont proposé il s'agit de flag pour flash, g ou m ne seront pas reconnu par php).

@+
Il en faut peu pour être heureux ......

marih
Invité n'ayant pas de compte PHPfrance

10 nov. 2011, 18:06

Grand merci à moogli pour sa gentillesse et son efficacité !
Je tournais en rond dans les explications et j'étais perdu !
Merci encore.

marih
Invité n'ayant pas de compte PHPfrance

12 nov. 2011, 12:02

Bonjour Moogli,
j'ai essayé de poursuivre mais....
les lignes suivantes tirée du "cours sur internet" ne fonctionnent pas ..
<?php
preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {
    echo "matched: " . $val[0] . "\n";
    echo "part 1: " . $val[1] . "\n";
    echo "part 2: " . $val[2] . "\n";
    echo "part 3: " . $val[3] . "\n";
    echo "part 4: " . $val[4] . "\n\n";
}
?>
Il semble que le PREG_SET_ORDER ne soit pas accepté et de plus quand je l'enlève les variables renvoyées sont vides.
Je ne comprends pas et toi ?
Merci de ton aide si tu le peux.

Mammouth du PHP | 672 Messages

14 nov. 2011, 12:47

Il semble que le PREG_SET_ORDER ne soit pas accepté et de plus quand je l'enlève les variables renvoyées sont vides.
PREG_SET_ORDER est une option acceptée par preg_match_all(). Je ne vois pas trop pourquoi elle ne serait pas acceptée dans ta configuration.
=> Le problème vient plutôt de ton code...
(<([\w]+)[^>]*>)(.*?)(<\/\\2>)
Décompose le pattern, histoire de comprendre ce qu'il fait. Parce que là, il fonctionne bien...
Mais il ne donne pas forcément le résultat que tu souhaitais dans ton premier message !
$texte = 'des trucs <img id="id" src="/repertoire/image.jpg" class="class" /><b>les machins</b>test';
preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $texte, $matches, PREG_SET_ORDER);
Résultat :
matched: <b>les machins</b>
part 1: <b>
part 2: b
part 3: les machins
part 4: </b>
Je te conseille de lire le manuel, y compris les exemples et les discussions...

Et sinon, je persiste : apprends à chercher !
Une recherche sur google avec les mots clés "php récupérer image balise html" te donne la réponse :roll:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 nov. 2011, 16:08

Suite à un multipostage, j'ai clôturer un autre sujet où il y avait moins de réponse (php-avance/comment-boucler-sur-preg-match-t261189.html).

Toutefois, je te conseille d'analyser(pas juste la copier/coller) la solution de stealth35 (celle là) qui est beaucoup plus élégante et résistante qu'une expreg de ta composition.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

marih
Invité n'ayant pas de compte PHPfrance

15 nov. 2011, 22:40

Merci pour toutes vos réponses mais certaines me dépassent encore plus que d'autres...
aussi je vais essayer de terminer d'abord avec les "regex".
Je résume : je cherche à récupérer le nom d'un fichier image contenu dans un texte HTML. Il peut s'écrire:
(exemple 1) <img src="Tarata.jpg" width="181" height="361">
ou
(exemle 2) <img src="Calamity.jpg" alt="toto" width="181" height="361"> ou autrement...

- Si j'utilise:
preg_match(('#<img(.*)src="(.*)" (.*)>#is',$text); comme proposé plus haut rien n'est trouvé.

- Si je bidouille, celui-ci est meilleur même si je ne comprends pas tout ! :

preg_match('#<img(.*)src="(.*)" w#is',$string,$matches); ça marche pour exemple 1 et je reçois alors Tarata.jpg mais il arrive que ça ne marche pas pour des écritures apparemment identiques... mais il doit y avoir un caractère qui coince !

- ainsi pour l'exemple 2 je suppose à cause du alt et dans ce cas je reçois Calamity.jpg" alt="toto" ... avec la suite... ==> la côte après jpg est sortie à tord avec la suite, pourquoi alors que précédemment elle ne sort pas ?

J'ai essayé d'autres combinaisons selon la doc mais peine perdue !

C'est vraiment difficile à coder mais si proche apparemment !
Peut-être avez-vous la solution ?
Merci

ViPHP
ViPHP | 5462 Messages

16 nov. 2011, 11:23

pourquoi tu fais pas comme j'ai dit ?

marih
Invité n'ayant pas de compte PHPfrance

17 nov. 2011, 11:19

Bonjour Stealth35,
pour plusieurs raisons... la première c'est que vu le temps que j'ai passé sur le preg-matches j'aimerai comprendre vraiment comment il fonctionne donc ce qui est mal codé pour que çà marche car çà doit marcher ! non ? mais peut-être est-ce trop compliqué et trop difficile et qu'en fait personne ne sait ... ?
La deuxième c'est que ce n'est pas mon métier et que l'important n'est pas dans le "contenant" du site mais le "contenu" ce qui me demande beaucoup plus de temps et de travail. Donc il me faut terminer cela assez vite avant de chercher à implémenter éventuellement quelque chose de "plus beau" en terme d'écriture.
That's all folks !

ViPHP
ViPHP | 5462 Messages

17 nov. 2011, 12:15

je pense que t'as perdu déjà assez de temps, pour ne pas utiliser ma solution non ?

mais bon il faut te mettre en ungready si tu veux que ça marche

Mammouth du PHP | 672 Messages

17 nov. 2011, 14:06

1. La solution donnée par stealth35 - utiliser le DOM - est efficace et ne devrait pas te prendre trop de temps.
En plus, la logique est simple à comprendre :
- Tu ouvres un fichier (x)HTML (avec loadHTMLFile()
- Tu récupères les éléments img (avec getElementsByTagName())
- Pour chaque élément récupéré, tu récupères l'attribut src (avec getAttribute())

Tu dis que ce n'est pas ton métier. Si j'étais méchant, je te dirais de demander à quelqu'un dont c'est le métier - et de le payer :twisted:
Mais tu as de la chance, je suis de bonne humeur...
- Si je bidouille, celui-ci est meilleur même si je ne comprends pas tout !
C'est pour ça que ça ne fonctionne pas !

Les expressions régulières, c'est quelque chose de carré. Si tu ne comprends pas ce que tu demandes, il y a peu de chances que ça fonctionne correctement #-o

Exemple du premier pattern : <img(.*)src="(.*)" (.*)>
Tu cherches ce qui commences par <img, puis 0 ou plusieurs caractères quelconques (qu'il stockera dans un premier élément), puis src=", puis 0 ou plusieurs caractères quelconques (qu'il stockera dans un deuxième élément), puis " (guillemet + espace), puis 0 ou plusieurs caractères quelconques (qu'il stockera dans un troisième élément), puis >.
=> pour <img src="Tarata.jpg" width="181" height="361">, il va prendre :
<img, puis " " (un espace, stocké dans le premier élément), puis src=", puis Tarata.jpg" width="181 (stocké dans le deuxième élément), puis " (guillemet + espace), puis height="361" (stocké dans le troisième élément), puis >.
Et sinon, je persiste : apprends à chercher !
Une recherche sur google avec les mots clés "php récupérer image balise html" te donne la réponse
Puisque tu n'as toujours pas appris à chercher, Solution trouvée en première page de Google :
$texte = 'des trucs <img src="image.jpg" /> des machins';
$texte = "des trucs <img src='/image.jpg' /> des machins";
$texte = 'des trucs <img class="class" src="../image.jpg" /> des machins';
$texte = 'des trucs <img id="id" src="/repertoire/image.jpg" class="class" /> des machins';
 
$masque = '#<img (?:.*?)src=(?:"|\')(.+)(?:"|\')(?:.*?) />#Uis';
preg_match_all($masque, $texte, $resultats);
echo '<pre>',print_r($resultats),'</pre>';

marih
Invité n'ayant pas de compte PHPfrance

18 nov. 2011, 14:52

Merci à tous et en particulier à macgawel qui m'a permis de trouver la seule écriture qui fonctionne dans TOUS les cas et que voici:

$masque = '#<img .*src=(?:"|\')(.+)(?:"|\').*>#Uis'; sur un preg_match-all.

A+
Bonne journée