Discussion:
exception Empty delimiter
(trop ancien pour répondre)
j4e8a16n
2009-03-12 16:55:03 UTC
Permalink
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);
Olivier Miakinen
2009-03-12 17:50:40 UTC
Permalink
Bonjour,
Post by j4e8a16n
J'aimerais savoir coment je peux capturer une exception comme celle
Warning: stristr(): Empty delimiter in C:\Users\Jean Pierre\Desktop
\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.
Post by j4e8a16n
--------------------------
$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.
Post by j4e8a16n
$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
Olivier Miakinen
2009-03-12 19:30:04 UTC
Permalink
Post by j4e8a16n
$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('/^[ \t\n\r]*(.*\\)?/', '/(\.[^.]*)?[ \t\n\r]*$/'),
'', $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
Olivier Miakinen
2009-03-13 12:42:51 UTC
Permalink
Post by Olivier Miakinen
// 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 ]

Pascal PONCET
2009-03-12 18:21:14 UTC
Permalink
Post by j4e8a16n
J'aimerais savoir coment je peux capturer une exception comme celle
Warning: stristr(): Empty delimiter in C:\Users\Jean Pierre\Desktop
\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
Continuer la lecture sur narkive:
Loading...