utiliser preg_split

Eléphanteau du PHP | 34 Messages

27 juin 2011, 08:38

Bonjour à tous,

Pour pouvoir scinder le nom de ma ville et mettre des majuscules à la première lettre du mot, ('Saint Germain l'Espinasse) j'ai tenté, pour commencer, d'utiliser preg_split qui devrait mes séparer les mots en fonction de l'apostrophe ou de l'espace... Et bien non, je n'y arrive pas.

$chaine = 'saint germain l'espinasse';
$chaine = preg_split('/[\'][\s]/', $chaine);

Quelqu'un pourrait-il m'aider ? Merci d'avance.
Il est très difficile de prédire l'avenir, surtout lorsqu'il s'agit du futur...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2011, 09:20

Bonjour, c'est simple tu dois écrire comme ça:
<pre>
<?php
$chaine ="saint germain l'espinasse";
$chaine = preg_split('/\'|\s/', $chaine);
print_r($chaine);
?>
</pre>
Le caractère | (pipe) dans le filtre de la regexp se lit : OU
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

27 juin 2011, 09:28

Merci pour la réponse rapide.

J'avais trouvé ça sur ManuelPHP : $keywords = preg_split("/[\s']+/", $text); mais je ne sais pas à quoi correspond le '+'. Vous aurriez une idée ?
Il est très difficile de prédire l'avenir, surtout lorsqu'il s'agit du futur...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2011, 09:56

Le plus (+) signifie : plusieurs occurrences
Le filtre que tu cite est bon : "/[\s']+/" car il est entre guillemets ce qui permet de ne pas mettre \'. Les crochets permettent de lire le OU donc ici on cherche l'espace \s ou bien l'apostrophe ' pouvant exister une ou plusieurs fois (+) on peut aussi utiliser l'étoile * pour 0 à plusieurs fois ou ? (0 à une fois)

Ceci dit, voici un exemple qui transforme directement les débuts de mots en majuscule en utilisant preg_replace_callback()
<pre>
<?php
$chaine = "saint germain l'espinasse";

//Majuscule en début de mot
$chaine2 = preg_replace_callback('/(\w*)/','maj', $chaine);
echo($chaine2);

//fonction callback utilisée par preg_replace_callback()
function maj($matches)
{
	// ici $matches[0] contient le mot trouvé
	if (isset($matches[0][0])) $matches[0][0]= strtoupper($matches[0][0]); //maj sur le 1° caractère
	return $matches[0];
}
?>
</pre>
Le callback dans une recherche par preg_replace_callback() est une opération qui consiste à appeler une fonction à chaque fois que le filtre (pattern) de la regexp est trouvé dans une chaine. Dans notre exemple on cherche tous les mots (\w*) et à chaque mot trouvé la fonction callback nommée "maj" est appelée et le mot trouvé lui est transmis automatiquement par le système dans le paramètre (tableau) $matches et dans la première case n°0 de ce tableau. La fonction maj() est donc programmée pour transformer le début du mot trouvé en majuscule en utilisant la fonction strtoupper(). Ceci est effectué par la commande:
$matches[0][0]= strtoupper($matches[0][0]);
où $matches[0] est un mot trouvé par la recherche regexp et $matches[0][0] désigne le premier caractère de la chaine $matches[0]. Car une chaine se comporte comme un tableau.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

27 juin 2011, 10:23

Merci encore une fois pour la réponse.

C'est très clair et j'ai tout compris. Il y a un hic (il me semble, je n'ai pas testé, je réponds d'abord) c'est dans le cas de l'Espinasse, il va mettre L'Espinasse, cad une majuscule au 'l', mais je vais voir ça et trouver la parade, au cas où...

De toutes façons, merci encore. C'était très sympa de votre part.

Cordialement.
Il est très difficile de prédire l'avenir, surtout lorsqu'il s'agit du futur...