Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

exception Empty delimiter

4 réponses
Avatar
j4e8a16n
Bonjour à tous,

J'aimerais savoir coment je peux capturer une exception comme celle
là:

Warning: stristr(): Empty delimiter in C:\Users\Jean Pierre\Desktop
\doublons.php on line 37
Elle proviendrait du fait que à un moment , y = rien
--------------------------
$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];
$x = strripos ($premier, "\\") + 1;
$y = strripos ($premier, ".");
$librairie = trim(substr($premier, $x, $y));

for ($i = 0; $i < $max; $i++ ){

$swish = stristr($inLibrairies[$i], $librairie);
------------------------------------------------------------------------------
>

Merci à tous,

JPD

4 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 12/03/2009 17:55, j4e8a16n a écrit :

J'aimerais savoir coment je peux capturer une exception comme celle
là:

Warning: stristr(): Empty delimiter in C:UsersJean PierreDesktop
doublons.php on line 37
Elle proviendrait du fait que à un moment , y = rien



Ce n'est pas « rien » mais « FALSE », ce qui peut se tester avec
l'opérateur === pour faire la distinction avec la valeur 0.

--------------------------
$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];
$x = strripos ($premier, "") + 1;



Attention, tu as potentiellement le problème ici aussi : si ta chaîne ne
contient aucun « », FALSE+1 donnera 1, ce qui supprimera le premier
caractère. Note au passage qu'il est inutile de demander une recherche
insensible à la casse de caractères qui ne sont pas des lettres.

$y = strripos ($premier, ".");
$librairie = trim(substr($premier, $x, $y));



Alors la correction la plus immédiate est la suivante :

$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];
$x = strrpos($premier, "");
$y = strrpos($premier, ".");

if ($x === FALSE || $y === FALSE) {
// traitement de l'erreur
} else {
$librairie = trim(substr($premier, $x+1, $y));
...
}

Mais ceci peut cacher d'autres problèmes. Par exemple, si le dernier
« » se trouve *après* le dernier « . », tu vas te retrouver avec un
$x plus grand que $y !

Moi, je ferais plutôt ceci :

$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];

// S'il y a au moins un '' on supprime tout jusqu'au dernier ''
$librairie = preg_replace('/.*/', '', $premier);

// S'il y a au moins un '.', on supprime tout à partir du dernier '.'
$librairie = preg_replace('/.[^.]*/', '', $librairie);

// Supprime d'éventuels espaces résiduels au début et à la fin
$librairie = trim($librairie);
...

Cordialement,
--
Olivier Miakinen
Avatar
Pascal PONCET
j4e8a16n a écrit :
J'aimerais savoir coment je peux capturer une exception comme celle
là:
Warning: stristr(): Empty delimiter in C:UsersJean PierreDesktop
doublons.php on line 37



Bonsoir,

Comme toutes les anciennes fonctions de PHP, stristr() ne supporte pas
le mécanisme d'exception mais seulement la gestion d'erreur.

Si besoin est, on peut malgré tout déclencher des exceptions à partir
des erreurs par l'intermédiaire de la classe ErrorException.
Voir : http://fr.php.net/manual/en/class.errorexception.php

Cordialement,
Pascal
Avatar
Olivier Miakinen
Le 12/03/2009 18:50, je répondais à j4e8a16n :

Moi, je ferais plutôt ceci :

$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];

// S'il y a au moins un '' on supprime tout jusqu'au dernier ''
$librairie = preg_replace('/.*/', '', $premier);

// S'il y a au moins un '.', on supprime tout à partir du dernier '.'
$librairie = preg_replace('/.[^.]*/', '', $librairie);

// Supprime d'éventuels espaces résiduels au début et à la fin
$librairie = trim($librairie);
...



Voici un code un peu plus compact répondant à la même problématique.
Les deux ne sont pas strictement équivalents, mais je parierais que les
résultats seront les mêmes dans tous les cas « réels », c'est-à_dire :
- s'il n'y a jamais de caractères nuls ou de tabulations verticales ;
- s'il n'y a jamais de blancs (espaces et autres) juste après le dernier
antislash ou juste avant le dernier point.

$max = count($inLibrairies);
$premier = $inLibrairies[$clefs];
$librairie = preg_replace(
array('/^[ tnr]*(.*)?/', '/(.[^.]*)?[ tnr]*$/'),
'', $premier);
...

Pour le cas où il y aurait besoin de fournir des explications concernant
ces expressions rationnelles, je propose un suivi vers le groupe
fr.comp.lang.regexp.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 12/03/2009 18:50, je m'étais trompé :

// S'il y a au moins un '.', on supprime tout à partir du dernier '.'
$librairie = preg_replace('/.[^.]*/', '', $librairie);



Ici, il faut « ancrer » l'expression rationnelle sur la fin de la chaîne
(alors que ce n'était pas nécessaire pour la précédente) :

$librairie = preg_replace('/.[^.]*$/', '', $librairie);

La proposition plus compacte que j'ai déjà donnée n'a pas ce défaut car
j'avais ancré à gauche et à droite pour simuler le trim().

[ copie et suivi vers fr.comp.lang.regexp ]