OVH Cloud OVH Cloud

Evolution future de la sélection+modification d'une chaîne de caractères.

15 réponses
Avatar
Jean Francois Ortolo
Bonjour

Voici le problème :

Actuellement, pour toutes les versions récentes de php ( à part
peut-être les verions bêta de php 6, je ne sais pas ), il est possible
d'accéder à une sous-chaîne d'une chaîne de caractère, avec les
opérateurs : [] et {}.

Par exemple, voyons le code :

$str = "ABCDEFGHIJKLMNOPQ";

echo $str[0] . "\n"; // donne A

echo $str[10] . "\n"; // Donne K


Mais.. Cette fonctionnalité de l'opérateur [] ( et éventuellement de
l'opérateur {} ) sur les chaînes de caractères, va-t-elle perdurer sur
toutes les versions futures, de php ?

Je suppose, qu'il y a pas mal de scripts php dans le Monde, qui
nécessite cet opérateur [] ?


Ma deuxième question, c'est pour parer à une éventuelle disparition
de cette fonctionnalité :

Il suffirait de copier la chaîne de caractère, sur une array, en
prenant comme séparateur de preg_split(), la chaîne vide.

Voici le code :

$str = "ABCDEFGHIJKLMNOPQ";

$array_str = array();

$array_str = preg_split("//", $str);

ou bien :

$array_str = preg_split("/[]/", $str);


Celà fonctionnerait-il ?

Si oui, il suffirait de sélectionner l'array $array_str , au lieu de
la chaîne $str :

echo $str[10] . "\n"; // Ne marche plus...

echo $array_str[10] . "\n"; // Donne K, comme avant.


Cette utilisation de preg_split() avec un séparateur vide,
fonctionne-t-elle ?

Merci beaucoup de vos réponses à mes deux questions.

Bien amicalement.

Jean François Ortolo

5 réponses

1 2
Avatar
Jean Francois Ortolo
Bonsoir Monsieur

Finalement, voici le code résistant à toutes les modifications
possibles des fonctions suivant les versions de PHP.

Ce code est destiné, à fonctionner en mode ISO-8859-1 exclusivement,
ce qui implique simplement, que le script soit codé en ISO, et soit
interprété en mode ISO, ce qui devrait rester possible quelle que soit
l'évolution à terme de PHP, si la programmation php en mode iso reste
possible.

Celà veut dire, que la seule possibilité pour que ce code ne soit
plus valide, serait que des versions ultérieures de PHP, rendent
strictement obligatoire, un mode de codage de caractères différent de
ISO-8859-1 et ISO-8859-15, ce qui vous l'avouerez, est plus que très
improbable.

Voici le code :


function array_to_to_str($tmp_array)
{
$str = "";

for($i = 0; $i < count($tmp_array); $i++)
$str .= $tmp_array[$i];

return($str);
}

function str_to_to_array($str)
{
$tmp_array = array();

for($i = 0; $i < strlen($str); $i++)
$tmp_array[$i] = substr($str, $i, 1);

return($tmp_array);
}


Ce code sous-entend, que la fonction substr() perdurera à terme dans
le futur pour toutes les versions ultérieures de PHP

Pour adapter le code de mon site, avec $str étant le nom de la
variable sélectionnée jusqu'ici par l'opérateur [] , il me suffira de
rajouter, avant chaque groupes de sélections, la ligne suivante :

$str = str_to_to_array($str);

Et après chaque groupes de sélections, la ligne :

$str = array_to_to_str($str);

Pour retrouver une chaîne de caractère modifiée par la sélection+
modification sur l'array temporaire $str

Si j'ai besoin de sauvegarder la variable chaîne $str avant un groupe
de sélections, je peux le faire très facilement, puis adapter le code de
manière très facile.

Il me suffit d'incorporer le code de ces deux fonctions dans mon
script php de configuration, inclus dans tous mes scripts php, pour
disposer de ces deux fonctions, sans aucune possibilité de confusion
avec des fonctions existantes.

Je pense, qu'en ce qui me concerne, le problème est résolu.

Bien amicalement.

Jean François Ortolo
Avatar
Clément
Le 07/05/2012 22:42, Jean Francois Ortolo a écrit :

Bonsoir Monsieur

Finalement, voici le code résistant à toutes les modifications possibles
des fonctions suivant les versions de PHP.

Ce code est destiné, à fonctionner en mode ISO-8859-1 exclusivement, ce
qui implique simplement, que le script soit codé en ISO, et soit
interprété en mode ISO, ce qui devrait rester possible quelle que soit
l'évolution à terme de PHP, si la programmation php en mode iso reste
possible.

Celà veut dire, que la seule possibilité pour que ce code ne soit plus
valide, serait que des versions ultérieures de PHP, rendent strictement
obligatoire, un mode de codage de caractères différent de ISO-8859-1 et
ISO-8859-15, ce qui vous l'avouerez, est plus que très improbable.

Voici le code :


function array_to_to_str($tmp_array)
{
$str = "";

for($i = 0; $i < count($tmp_array); $i++)
$str .= $tmp_array[$i];

return($str);
}

function str_to_to_array($str)
{
$tmp_array = array();

for($i = 0; $i < strlen($str); $i++)
$tmp_array[$i] = substr($str, $i, 1);

return($tmp_array);
}


Ce code sous-entend, que la fonction substr() perdurera à terme dans le
futur pour toutes les versions ultérieures de PHP

Pour adapter le code de mon site, avec $str étant le nom de la variable
sélectionnée jusqu'ici par l'opérateur [] , il me suffira de rajouter,
avant chaque groupes de sélections, la ligne suivante :

$str = str_to_to_array($str);

Et après chaque groupes de sélections, la ligne :

$str = array_to_to_str($str);

Pour retrouver une chaîne de caractère modifiée par la sélection+
modification sur l'array temporaire $str

Si j'ai besoin de sauvegarder la variable chaîne $str avant un groupe de
sélections, je peux le faire très facilement, puis adapter le code de
manière très facile.

Il me suffit d'incorporer le code de ces deux fonctions dans mon script
php de configuration, inclus dans tous mes scripts php, pour disposer de
ces deux fonctions, sans aucune possibilité de confusion avec des
fonctions existantes.

Je pense, qu'en ce qui me concerne, le problème est résolu.

Bien amicalement.

Jean François Ortolo






Malheureusement pour vous, il ne l'est pas.
$str = str_to_to_array('£$épourquoi ç a @& à');
donnera quelque chose d'éronné.

http://codepad.org/pm2pZy6y

(ce même bout de code a fait planter http://codepad.viper-7.com d'ailleurs

J'ai mis 20 caractères et pourtant le tableau résultant en aura 24.
Car £, é, ç, à sont des caractères utf-8. À moins que vous ne vouliez
pas utiliser d'accent (site en anglais par exemple), votre fonction ne
fonctionnera pas partout. En effet, strlen() est une fonction qu'il faut
utiliser avec parcimonie. mb_strlen() pourrait pallier à ça.

Et encore une fois, rien n'indique que les fonctions basiques utilisées
dans les vôtres ne seront pas modifiées. Ainsi, à tenter de faire du
"compatible" sur le long terme, vous risquez de perdre du temps
maintenant et plus tard.
Avatar
Jean Francois Ortolo
Le 08/05/2012 11:20, Clément a écrit :
Le 07/05/2012 22:42, Jean Francois Ortolo a écrit :

Bonsoir Monsieur

Finalement, voici le code résistant à toutes les modifications possibles
des fonctions suivant les versions de PHP.

Ce code est destiné, à fonctionner en mode ISO-8859-1 exclusivement, ce
qui implique simplement, que le script soit codé en ISO, et soit
interprété en mode ISO, ce qui devrait rester possible quelle que soit
l'évolution à terme de PHP, si la programmation php en mode iso reste
possible.

Celà veut dire, que la seule possibilité pour que ce code ne soit plus
valide, serait que des versions ultérieures de PHP, rendent strictement
obligatoire, un mode de codage de caractères différent de ISO-8859-1 et
ISO-8859-15, ce qui vous l'avouerez, est plus que très improbable.

Voici le code :


function array_to_to_str($tmp_array)
{
$str = "";

for($i = 0; $i < count($tmp_array); $i++)
$str .= $tmp_array[$i];

return($str);
}

function str_to_to_array($str)
{
$tmp_array = array();

for($i = 0; $i < strlen($str); $i++)
$tmp_array[$i] = substr($str, $i, 1);

return($tmp_array);
}


Ce code sous-entend, que la fonction substr() perdurera à terme dans le
futur pour toutes les versions ultérieures de PHP

Pour adapter le code de mon site, avec $str étant le nom de la variable
sélectionnée jusqu'ici par l'opérateur [] , il me suffira de rajouter,
avant chaque groupes de sélections, la ligne suivante :

$str = str_to_to_array($str);

Et après chaque groupes de sélections, la ligne :

$str = array_to_to_str($str);

Pour retrouver une chaîne de caractère modifiée par la sélection+
modification sur l'array temporaire $str

Si j'ai besoin de sauvegarder la variable chaîne $str avant un groupe de
sélections, je peux le faire très facilement, puis adapter le code de
manière très facile.

Il me suffit d'incorporer le code de ces deux fonctions dans mon script
php de configuration, inclus dans tous mes scripts php, pour disposer de
ces deux fonctions, sans aucune possibilité de confusion avec des
fonctions existantes.

Je pense, qu'en ce qui me concerne, le problème est résolu.

Bien amicalement.

Jean François Ortolo






Malheureusement pour vous, il ne l'est pas.
$str = str_to_to_array('£$épourquoi ç a @& à');
donnera quelque chose d'éronné.

http://codepad.org/pm2pZy6y

(ce même bout de code a fait planter http://codepad.viper-7.com d'ailleurs

J'ai mis 20 caractères et pourtant le tableau résultant en aura 24.
Car £, é, ç, à sont des caractères utf-8. À moins que vous ne vouliez
pas utiliser d'accent (site en anglais par exemple), votre fonction ne
fonctionnera pas partout. En effet, strlen() est une fonction qu'il faut
utiliser avec parcimonie. mb_strlen() pourrait pallier à ça.

Et encore une fois, rien n'indique que les fonctions basiques utilisées
dans les vôtres ne seront pas modifiées. Ainsi, à tenter de faire du
"compatible" sur le long terme, vous risquez de perdre du temps
maintenant et plus tard.






Bonjour Monsieur

Je ne comprend pas très bien.

L'utilisation de ce code, présuppose, que les données paramètres des
fonctions, seront tous codés en mode ISO-8859-1 ou ISO-8859-15 à la rigueur.

Quant à é , ç, et à, ils peuvent très bien être codés en ISO-8859-1,
et je m'arrange bien, avec la fonction iconv() pour des données
provenant de l'extérieur, pour que mes données soient toutes en iso.

J'ai évidemment tenu compte du fait, que les fonctions strlen() et
substr() dans mon code, n'acceptent que des paramètres en mode ISO.

D'ailleurs, c'est le but de mon site, de rester en mode iso, sans
limite de temps, compte tenu du fait, qu'il est peu probable, que même à
terme, le comité PHP décide d'obliger strictement les utilisateurs de
php, à programmer en mode utf8 ( ou utf16, ou utf32 ).

Bien à vous.

Amicalement.

Jean François Ortolo
Avatar
Clément
Le 08/05/2012 11:34, Jean Francois Ortolo a écrit :
Bonjour Monsieur

Je ne comprend pas très bien.

L'utilisation de ce code, présuppose, que les données paramètres des
fonctions, seront tous codés en mode ISO-8859-1 ou ISO-8859-15 à la
rigueur.

Quant à é , ç, et à, ils peuvent très bien être codés en ISO-8859-1, et
je m'arrange bien, avec la fonction iconv() pour des données provenant
de l'extérieur, pour que mes données soient toutes en iso.

J'ai évidemment tenu compte du fait, que les fonctions strlen() et
substr() dans mon code, n'acceptent que des paramètres en mode ISO.

D'ailleurs, c'est le but de mon site, de rester en mode iso, sans limite
de temps, compte tenu du fait, qu'il est peu probable, que même à terme,
le comité PHP décide d'obliger strictement les utilisateurs de php, à
programmer en mode utf8 ( ou utf16, ou utf32 ).

Bien à vous.

Amicalement.

Jean François Ortolo




Bon je n'insisterai pas. Mais c'est quand même étrange comme point de
vue (vouloir absolument être compatible avec les versions PHP
ultérieures mais vouloir absolument resté en iso, habituellement, on
fait l'inverse).
Avatar
SAM
Le 05/05/12 16:02, Jean Francois Ortolo a écrit :

sur le NG du PHP

Et... La fonction str_split() , ne risque pas de disparaître avec les
versions ultérieures de php ?



Pas grave, tu utiliseras alors le JavaScript avec la fonction split()

uneChaine.split('');

la chaine uneChaine est devenu un array dont chaque élément est une des
lettres de la chaine (peu importe si c'est de l'iso-truc ou de l'utf-8
si le charset a été déclaré qque part (en-têtes du serveur ou du fichier))


var a = 'Jean François Ortolo';
a.split('');
alert(a[5]); // F
alert(a[14]); // O
alert(a.length); // 20
alert(a); // J,e,a,n, ,F,r,a,n,ç,o,i,s, ,O,r,t,o,l,o


Mébon, ceci fonctionne aussi :

var b = 'Jean François Ortolo';
alert(b[5]); // F
alert(b.charAt(5)) // F


exo avec expression régulière :

var c = 'Jean François Ortolo',
r = new RegExp('o','gi'),
m = c.match(r),
n = m.length,
t = '';
alert(n);
while(n--) t += 'index : ' + n + ' / lettre : ' + m[n] +'n';
alert(t);

variante :
r = new RegExp('[oO]','g');


exo avec remplacement de chaîne :

var c = 'Jean François Ortolo',
t = c.replace(/s/g, '/'); // code de regexp "simplifié"
alert(t); // Jean/François/Ortolo

var c = 'Jean François Ortolo',
r = new RegExp(' ','g'),
t = c.replace(r, '/');
alert(t);

t = c.replace(/[oO]/g, 'eau');
alert(t); // Jean Françeauis eaurteauleau



autre, avec split et join :

var c = 'Jean François Ortolo',
t = c.split(' ').join('nt');
alert(t);
/*
Jean
François
Ortolo
*/



<https://developer.mozilla.org/fr/search?q=regexp>
a commence à être le foutoir sur MDN ... nombreuses pages se "copiant"
<https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript/Objets_globaux/RegExp>
<https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript/R%C3%A9f%C3%A9rence_JavaScript/Objets_globaux/RegExp>
<https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript/R%C3%A9f%C3%A9rence_JavaScript/Objets_globaux/RegExp>
<https://developer.mozilla.org/fr/Guide_JavaScript_1.5/Expressions_rationnelles>

--
Stéphane Moriaux avec/with iMac-intel
1 2