problème avec ltrim

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 : problème avec ltrim

merci

par nesquick » 22 févr. 2009, 20:42

merci vous deux !

par Ripat » 22 févr. 2009, 10:01

Le ^ est l'ancrage de début de ligne. Quand tu écris le motif ^icones, il y aura concordance et donc remplacement dans le cas de preg_replace() uniquement si icones se trouve en début de chaîne. En principe donc le preg_replace() que je donne plus haut ne devrait remplacer que la première occurrence du motif.

Les caractères # sont les délimiteurs du motif. Tu peux choisir n'importe quel caractère non alpha-numérique. Pour les tuto:

Ici sur notre site:
http://www.phpfrance.com/tutoriaux/inde ... pcre-ripat

Ou ici encore:
http://www.siteduzero.com/tutoriel-3-14 ... e-1-2.html

Le temps que tu investiras à l'apprentissage des regex ne sera pas perdu, même si tu changes de langage. Tous les langages modernes utilisent les expressions régulières de manière assez proche. Comme illustration de mon propos, voici une solution 100% regex à ton problème. Je ne dis pas que c'est la meilleure mais c'est la plus concise. Tu peux toujours remplacer une solution regex par un code basé sur les fonctions chaînes de php mais au prix d'une certaine lourdeur et, souvent aussi, d'une lenteur excessive. Tout dépend du contexte.
$txt = 'icones/foo/bar/icones/pic.jpg';
preg_match('#^icones/(.+/)(.+)$#', $txt, $out);
print_r($out);
Explication de la regex:

Code : Tout sélectionner

^icones/ il faut la sous-chaîne icones/ en début de chaîne (.+/) capture (grâce aux parenthèses) tous les caractères jusqu'au dernier / de la chaîne. (.+)$ capture de tout caractère jusqu'à l'ancrage de fin de chaîne $

par nesquick » 21 févr. 2009, 23:45

Je viens de lire la doc sur preg_replace, comme quoi on doit TOUJOURS lire la doc avant de se plaindre, je viens donc d'y voir qu'on pouvait indiquer une limite. Est-ce que je peux faire un truc du genre :
$mySearch = "#^".$base_path."/#";
preg_replace($mySearch, '', $path_parts['dirname'],1);
J'ai du mal avec les expressions régulières, à quoi correspondent le # et le ^ ? Où puis-je trouver une doc simple (je suis pas douée) sur le fonctionnement et tous ces caractères barbares qui me parlent martien ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par nesquick » 21 févr. 2009, 23:37

Ma très grande faute alors, je connaissais mal le fonctionnement de trim et il apparait que ce n'est pas la fonction dont j'ai besoin. Je ne peux pas non plus utiliser preg_replace ou les expressions régulières car je n'ai besoin de remplacer que le premier que je trouve.

En fait, j'ai un chemin pour une image, par exemple icones/ico_files/128x128/shadow/at.png
J'ai besoin de stocker le nom de l'image d'un côté, et le chemin de l'autre, MAIS sans mon chemin de base (dans le cas présent "icones/"), donc uniquement "ico_files/128x128/shadow/".

Mon chemin de base est le chemin commun à toutes mes images, elles sont toutes obligatoirement dans ce dossier. Le nom de ce dossier n'est pas obligatoirement "icones", dans mon programme c'est une variable définie par l'utilisateur à l'installation. Donc je dois d'une part la conserver en variable (ou en constante, peu importe) et d'autre part je dois prendre en compte le fait que ce nom peut être n'importe quoi, il faut donc faire attention au pattern de recherche/remplacement.

A la question "pourquoi ne pas stocker le chemin avec le chemin de base", je réponds que c'est une bonne question, je n'ai pas de vraie réponse sinon celle-ci : ça m'embête. Et puis j'imagine que si le chemin de base change, on est dans la m@rde. A priori celui-ci n'est pas censé changer, mais ça m'embête quand même. J'ai peut-être tort, hein :)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Ripat » 21 févr. 2009, 14:33

Comportement normal de ltrim() il me semble. La fonction supprimera tous les premiers caractères contenus dans le masque "icones/" que tu aurais aussi bien pu écrire "inc/ose" ou toute autre combinaison de ces caractères.

Code : Tout sélectionner

icones/ico-files/128x128/shadow ----------
Ce qui n'est pas normal c'est que ton code te renvoie

Code : Tout sélectionner

ico_files/128x128/shadow/at.png
.

Sur ma machine il renvoie correctement:

Code : Tout sélectionner

_files/128x128/shadow/at.png
Conformément à la définition de la fonction.

Essaye plutôt:
preg_replace('#^icones/#', '', $path_parts['dirname']); 

par nesquick » 21 févr. 2009, 13:47

Merci pour ta réponse. Je vais tester ça.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par sadeq » 20 févr. 2009, 14:20

Je n'ai pas d'explications pour l'instant à ce phénomène, mais si tu enlève le "/" final dans $base_path ça marche.

Exemple:
<?php
 echo ltrim("icones/ico-files/128x128/shadow/at.png", "icones"); 
?>

problème avec ltrim

par nesquick » 19 févr. 2009, 18:58

Bonjour,
J'ai un petit souci avec ltrim
// $element est de la forme chemin relatif. ex : icones/ico-files/128x128/shadow/at.png
// $base_path = "icones/"
$path_parts = pathinfo($element);
$myVar = ltrim($path_parts['dirname'],$base_path);
Ca marche bien d'habitude, mais là j'ai un dossier qui contient un - ("ico-files") et ça marche pluuuus !
Si $element = "icones/ico_files/128x128/shadow/at.png", aucun souci, il me sort $myVar = "ico_files/128x128/shadow/at.png", mais si j'ai $element = "icones/ico-files/128x128/shadow/at.png", ça me sort $myVar = "-files/128x128/shadow/at.png"
Pareil avec trim d'ailleurs.
Le pattern ne correspond pas, alors pourquoi il m'enlève un bout supplémentaire ???
Si vous avez la moindre idée de ce qu'il se passe... please help !
Merci d'avance,
nesquick

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]