Découpe de chaines multi-octets

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Découpe de chaines multi-octets

Découpe de chaines multi-octets

par jojolapine » 09 nov. 2008, 11:21

Bonjour à tous,
J'ai un petit soucis aujourd'hui...
Je cherche à faire une fonction à l'instar de substr(), mais qui ne me couperais pas les mots en deux...
donc pour l'instant j'ai ceci:
function mySubstr($c,$s,$l){
    if(!preg_match('#\s#',$c[$s+$l])){ //si on est pas sur un espace, une tabulation ou un retour à la ligne
        $l=(mb_strpos($c,' ',$s+l)-$s); //utilisation de mb_strpos, car j'ai des caractères utf8
        //on cherche le prochaine espace, et on change la longueur...
    }
    return mb_substr($c,$s$l);
}
Mon problème vient du fait que mb_strpos() ne veut pas reconnaitre des retours chariots ou des tabulation
Et j'aimerais éviter d'avoir trop affaire aux PCRE, donc si vous aviez une idée ;)
Merci d'avance!!

Alors j'ai avancé, et en fait j'ai réussit à reconnaitre les \net \r\n, il fallait entourer des doubles quotes, donc j'arrive à ceci:
function mySubstr($c,$s,$l){

     //si le caractère n'est pas un espace ou un saut de ligne, on cherche le suivant
    if($c[$s+$l]!==" " || $c[$s+$l]!=="\n" || $c[$s+$l]!=="\r\n"){
        
        //on cherche les prochaines position pour chaque type de caractère "blanc"
        if(mb_strpos($c," ",$s+$l)!==false)
            $res[]=mb_strpos($c," ",$s+$l)-$s;
        if(mb_strpos($c,"\n",$s+$l)!==false)
            $res[]=mb_strpos($c,"\n",$s+$l)-$s;
        if(mb_strpos($c,"\r\n",$s+$l)!==false)
            $res[]=mb_strpos($c,"\r\n",$s+$l)-$s;

        //enfin on prend le plus proche caractère "blanc" pour couper
        $l=min($res);
    }
    return mb_substr($c,$s,$l);
}
ça fonctionne nickel, mais je trouve un peu lourd de devoir faire le test [gras]!==false[/gras] à chaque fois, ça exécute deux fois mb_strpos, vous auriez une solution pour alléger un peu ça?