preg_replace [résolu]

preg_replace [résolu] - PHP - Programmation

Marsh Posté le 26-11-2010 à 17:35:52    

Bonjour,
 
Je souhaiterais modifier une chaîne de caractère particulière dans un texte.
Voici un exemple du texte :
 

Code :
  1. #EXTINF:0,foo
  2. http://foobar
  3. #EXTINF:0,bar
  4. http://barfoo


 
Je voudrais modifier la ligne http://foobar qui suit foo par huhu.  
 
Pour ça j'ai utilisé le code suivant, mais ça ne marche pas.

Code :
  1. $name = "foo";
  2. $pattern = "/foo/\n.*/\n/m";
  3. $replacement = "foo/\nhuhu/\n";
  4. $result = preg_replace( $pattern, $replacement, $content );


 
Une idée ?


Message édité par Riot le 01-12-2010 à 15:15:20

---------------
Be the one with the flames.
Reply

Marsh Posté le 26-11-2010 à 17:35:52   

Reply

Marsh Posté le 28-11-2010 à 00:12:29    

pourquoi \n ?
sinon ca serai :

Code :
  1. preg_replace('/(http:\/\/foo)(\S+)/', '$1huhu', $str);


 
mais c'est pas très claire comme demande

Reply

Marsh Posté le 28-11-2010 à 14:15:14    

str_replace ne serait il pas plus pratique ?

Reply

Marsh Posté le 28-11-2010 à 22:46:48    

stealth35 a écrit :

pourquoi \n ?
sinon ca serai :

Code :
  1. preg_replace('/(http:\/\/foo)(\S+)/', '$1huhu', $str);


 
mais c'est pas très claire comme demande


Parce que http://foobar correspond à la ligne du dessus, c'est-à-dire #EXTINF:0,foo
Du coup, je cherche à trouver "foo\n" + la ligne du dessous, pour pouvoir faire le remplacement.
 

flo850 a écrit :

str_replace ne serait il pas plus pratique ?


Oui mais c'est pour faire un truc classe et propre :o :D


---------------
Be the one with the flames.
Reply

Marsh Posté le 29-11-2010 à 10:00:05    

y'avait pas toute l'explication (mais je suis sur il manque encore des choses)

 

ducoup ca donne ca

 
Code :
  1. $str = <<<HEREDOC
  2. #EXTINF:0,foo
  3. http://foobar
  4. #EXTINF:0,bar
  5. http://barfoo
  6. HEREDOC;
  7.  
  8. echo preg_replace('/(#\w+:\d+,((?m)\S+)\s+http:\/\/\2)(\S+)/', '$1huhu', $str);
  9.  
  10. /*
  11. #EXTINF:0,foo
  12. #EXTINF:0,bar
  13. */


Message édité par stealth35 le 29-11-2010 à 10:05:31
Reply

Marsh Posté le 29-11-2010 à 10:11:40    

Code :
  1. $pattern = '`(#EXTINF:0,foo\n).*`';
  2. echo preg_replace($pattern, '\1huhu', $str);

Message cité 1 fois
Message édité par Dj YeLL le 29-11-2010 à 10:13:14

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 29-11-2010 à 10:27:25    

Dj YeLL a écrit :

Code :
  1. $pattern = '`(#EXTINF:0,foo\n).*`';
  2. echo preg_replace($pattern, '\1huhu', $str);



 
ça modifie rien ca  :sarcastic:

Reply

Marsh Posté le 29-11-2010 à 10:58:25    

Hello,
 
Merci pour votre aide.
Pour info, l'extrait de fichier que j'ai donné est le contenu d'une playlist .m3u.
Dans "#EXTINF:0,foo", foo désigne le nom du média ; et la ligne suivante désigne l'URI de ce média.
Ce que j'ai besoin de faire est de remplacer l'URI d'un média défini par une autre URI.
 
Dans l'exemple que j'ai donné en 1er post, je voudrais remplacer http://foobar qui suit foo par huhu. Donc au final je veux ça :

Code :
  1. #EXTINF:0,foo
  2. huhu
  3. #EXTINF:0,bar
  4. http://barfoo


 
J'ai donc modifié ton code, stealth35, pour arriver à ce que je veux :

Code :
  1. echo preg_replace('/(#\w+:\d+,foo\s+)(\S+)/', '$1\nhuhu', $str);


Mais ça ne fonctionne toujours pas.


---------------
Be the one with the flames.
Reply

Marsh Posté le 29-11-2010 à 10:59:27    

stealth35 a écrit :


 
ça modifie rien ca  :sarcastic:


 
Bah si [:spamafote]
 

Code :
  1. $str = <<<HEREDOC
  2. #EXTINF:0,foo
  3. http://foobar
  4. #EXTINF:0,bar
  5. http://barfoo
  6. HEREDOC;
  7.  
  8. $pattern = '`(#EXTINF:0,foo\n).*`';
  9. echo preg_replace($pattern, '\1huhu', $str);
  10.  
  11. /*
  12. #EXTINF:0,foo
  13. huhu
  14. #EXTINF:0,bar
  15. */


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 29-11-2010 à 11:02:57    

Dj YeLL, ce pattern n'est pas matché :/


---------------
Be the one with the flames.
Reply

Marsh Posté le 29-11-2010 à 11:02:57   

Reply

Marsh Posté le 29-11-2010 à 11:03:16    

chez moi ca fait

 
Code :
  1. #EXTINF:0,foo
  2. http://foobar
  3. #EXTINF:0,bar
  4. http://barfoo
 

et même du-coup ca marche pas, ca fais que 1 remplacement, et ca surprime toute la ligne

 
Riot a écrit :

Hello,

 

Merci pour votre aide.
Pour info, l'extrait de fichier que j'ai donné est le contenu d'une playlist .m3u.
Dans "#EXTINF:0,foo", foo désigne le nom du média ; et la ligne suivante désigne l'URI de ce média.
Ce que j'ai besoin de faire est de remplacer l'URI d'un média défini par une autre URI.

 

Dans l'exemple que j'ai donné en 1er post, je voudrais remplacer http://foobar qui suit foo par huhu. Donc au final je veux ça :

Code :
  1. #EXTINF:0,foo
  2. huhu
  3. #EXTINF:0,bar
  4. http://barfoo
 

J'ai donc modifié ton code, stealth35, pour arriver à ce que je veux :

Code :
  1. echo preg_replace('/(#\w+:\d+,foo\s+)(\S+)/', '$1\nhuhu', $str);


Mais ça ne fonctionne toujours pas.

 

pourquoi \n tu t'attend a quoi en faisant ca ?

 


sinon

 
Code :
  1. $str = <<<HEREDOC
  2. #EXTINF:0,foo
  3. http://foobar
  4. #EXTINF:0,bar
  5. http://barfoo
  6. HEREDOC;
  7.    
  8. echo preg_replace('/(#\w+:\d+,(foo)\s+)(\S+)/', '$1huhu', $str);

Message cité 1 fois
Message édité par stealth35 le 29-11-2010 à 11:09:14
Reply

Marsh Posté le 29-11-2010 à 11:05:28    

Riot a écrit :

Dj YeLL, ce pattern n'est pas matché :/


Ah si pardon, j'ai rien dit. Ça fonctionne !

Message cité 1 fois
Message édité par Riot le 29-11-2010 à 11:05:45

---------------
Be the one with the flames.
Reply

Marsh Posté le 29-11-2010 à 11:06:46    

stealth35 a écrit :

pourquoi \n tu t'attend a quoi en faisant ca ?


Je sais pas, c'est pas vraiment cette partie qui est importante :)


---------------
Be the one with the flames.
Reply

Marsh Posté le 29-11-2010 à 11:20:07    

Riot a écrit :


Ah si pardon, j'ai rien dit. Ça fonctionne !


 
Ben j'avais testé quand même :o


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 29-11-2010 à 11:24:55    

enfaite chez moi ca marche pas a cause des sauts de ligne, y'a juste un \n donc ca pose problème si les saut de ligne systeme sont pas les mêmes
dans le doute utilise \s+ a la place \n

Reply

Marsh Posté le 29-11-2010 à 11:37:35    

C'est pas faux :o


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 29-11-2010 à 11:42:28    

Merci beaucoup à vous deux !


---------------
Be the one with the flames.
Reply

Marsh Posté le 30-11-2010 à 17:53:13    

Re-bonjour,

 

En fait j'ai encore un petit soucis : il est possible que le nom du flux ("foo" dans mon exemple) contienne des parenthèses : "foo (bar)". Du coup l'expression régulière ne fonctionne plus.
Et pour compliquer le tout, il est aussi possible qu'il y ait plusieurs noms de flux ayant des parenthèses :

Code :
  1. #EXTINF:0,foo (bar)
  2. url://foobar
  3. #EXTINF:0,foo (beef)
  4. url://foobeef
 

Vous savez comment palier ce problème ?


Message édité par Riot le 01-12-2010 à 13:28:43

---------------
Be the one with the flames.
Reply

Marsh Posté le 01-12-2010 à 15:14:56    

En fait je m'en suis sorti avec un str_replace avant la requête : replacer '(' par '\(' et ')' par '\)'.


---------------
Be the one with the flames.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed