pattern pour pre_match

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : pattern pour pre_match

Re: pattern pour pre_match

par marih » 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

Re: pattern pour pre_match

par macgawel » 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>';

Re: pattern pour pre_match

par stealth35 » 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

Re: pattern pour pre_match

par marih » 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 !

Re: pattern pour pre_match

par stealth35 » 16 nov. 2011, 11:23

pourquoi tu fais pas comme j'ai dit ?

Re: pattern pour pre_match

par marih » 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

Re: pattern pour pre_match

par zeus » 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.

Re: pattern pour pre_match suite !

par macgawel » 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:

Re: pattern pour pre_match suite !

par marih » 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.

Re: pattern pour pre_match

par marih » 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.

Re: pattern pour pre_match

par moogli » 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).

@+

Re: pattern pour pre_match

par macgawel » 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 !

pattern pour pre_match

par marih » 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