Différentes fonctions permettent de faire des recherches de caractères ou de chaînes à l'intérieur d'une chaîne.

Parmi toutes les fonctions de recherche, les plus employées sont :

ATTENTION IMPORTANT

Toutes les fonctions de recherche retournent FALSE si elles ne trouvent pas ce qu'elles cherchent. Afin d'éviter de confondre le 0 de FALSE et le 0 de la position du premier caractère d'une chaîne, il faut toujours tester le résultat de ces fonctions avec l'opérateur d'identité === et pas avec l'opérateur d'égalité ==.

Soit le code suivant :

$x = 'François';
$pos = strpos($x, 'F');

$pos sera égal à 0, car 'F' est à la position 0 dans la chaîne $x.

Le test avec l'opérateur d'égalité simple :

if ($pos == false) { ...

ne permettra pas de faire la différence entre le nombre 0 et le booléen FALSE. Le script sera donc faux car il considérera que 'F' n'a pas été trouvé dans 'François'.
Pour éviter le transtypage automatique de l'opérateur d'égalité simple et bien récupèrer le booléen FALSE ou le nombre 0, il faut tester la valeur de retour de la fonction avec l'opérateur d'identitié :

if ($pos === false) { ...
Exemple : rechercher dans une chaîne

PHP permet de rechercher la dernière position d'un caractère dans une chaîne, mais n'offre pas de fonction permettant de rechercher la dernière position d'une sous-chaîne dans une chaîne. Pour réaliser ce travail, nous pouvons utiliser la fonction strrev() qui inverse l'ordre des caractères dans une chaîne.

Exemple : recherche de la dernière sous-chaîne

Exercice : tester une adresse e-mail

Ecrivez la fonction exo_isAdresseMail qui vérifie qu'une adresse email est composée de :

La chaîne ne doit contenir aucun espace.
Il ne peut y avoir qu'un caractère @
Les caractères doivent avoir l'un des codes ASCII suivants :

Exemples à tester :
piat@univ-fcomte.frfr
piat@lifc.univ-fcomte.fr
piatunifc-fcomte.fr
piat@univfcomte-fr

Une solution possible

Exercice : tester une adresse e-mail

Vous serez sans doute surpris à la lecture du code par l'utilisation de la fonction tester. C'est une fonction qui se trouve dans la bibliothèque bib_fonctions.php et qui permet comme son nom l'indique de tester si une fonction renvoie le résultat attendu.
Cette fonction accepte au minimum 3 paramètres :

  • le nom de la fonction à tester sous la forme d'une chaîne de caractères
  • le ou les paramètres attendus par la fonction à tester
  • la valeur de retour de la fonction à tester

Si le résultat renvoyé par la fonction à tester est celui attendu, le nom de la fonction est affiché en vert. Si ça n'est pas le cas, le nom de la fonction est affiché en rouge.

/**
 * Testeur de fonction
 *
 * @param string	arg[0]		nom de la fonction à tester
 * @param mixed		arg[1 à n-1] paramètres à passer à la fonction
 * @param mixed		arg[n]		résultat attendu
 */
function tester() {
	$args = func_get_args();
	if (count($args) < 3) {
		echo '<hr>La fonction tester doit avoir ',
						'au moins 3 paramètres.';
		return;
	}

	$fonction = array_shift($args);
	$attendu = array_pop($args);
	$retour = call_user_func_array($fonction, $args);

	$iMax = count($args);

	echo '<hr><span style="color:', 
			($retour === $attendu) ? 'green' : 'red', '">',
			'<b>', $fonction, '</b></span>',
			'<br>Paramètre', ($iMax > 1) ? 's : ' : ' : ';

	for ($i = 0; $i < $iMax; $i++) {
		echo '<span style="background:#ebebeb;margin:0 5px;">';
		var_dump($args[$i]);
		echo '</span>';
	}

	echo '<br>Attendu : ';
	var_dump($attendu);

	echo '<br>Retourné : ';
	var_dump($retour);
}