2010-04-07 9 views
6

Je voudrais écrire un analyseur (HTML) basé sur une machine d'état mais j'ai des doutes sur la façon de lire/utiliser une entrée. J'ai décidé de charger l'ensemble de l'entrée dans une chaîne, puis de travailler avec elle comme avec un tableau et de maintenir son index comme position d'analyse courante.Analyser une chaîne multi-octets en PHP

Il n'y aurait pas de problème avec le codage mono-octet, mais dans le codage multi-octets, chaque valeur ne représente pas un caractère, mais un octet d'un caractère.

Exemple:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8 

for($i=0; $i < 4; $i++) 
{ 
    echo $mb_string[$i], PHP_EOL; 
} 

Sorties:

Ĺ 
ž 
Ĺ 
Ą 

Cela signifie que je ne peux pas itérer la chaîne dans une boucle pour vérifier des caractères simples, parce que je ne sais jamais si je suis en au milieu d'un personnage ou non.

Ainsi, les questions sont les suivantes:

  • Comment lire un seul caractère sécurité I multi-octets d'une chaîne d'une manière amicale performance ?
  • Est-ce une bonne idée de travailler avec la chaîne car c'était un tableau dans ce cas ?
  • Comment lire l'entrée?

Répondre

2

http://php.net/mb_string est la chose que vous cherchez

  • caractères juste mb_substr un par un
  • pas jusqu'à ce que PHP6
  • quelle entrée exactement? La manière habituelle en général
+2

Notez que la section des commentaires pour 'mb_split' il comprend de nombreux exemples de la façon de casser une chaîne multi-octets dans un tableau de caractères - par exemple, http://us2.php.net/manual/fr/function.mb-split.php#80046 – Amber

+0

@Dav I don ' Je pense qu'il a vraiment besoin d'un tableau. –

+0

par entrée Je veux dire le code HTML à analyser. Peut-être qu'il y a une façon absolument différente d'utiliser la chaîne avec une machine d'état qui me manque :-) ...mais le mb_substr semble bien (si je connais le codage de chaîne, ce qui n'est pas si évident) –

1
mb_internal_encoding("UTF-8"); 

$mb_string = 'žščř'; 

$l=mb_strlen($mb_string); 

for($i=0;$i<$l;$i++){ 
    print(mb_substr($mb_string,$i,1)."<br/>"); 
} 
0

sans utiliser les mdb_relatedFunctions et avec des chaînes codées multi-octets, vous pouvez utiliser les fonctions standard de chaîne de sous lesquelles on pouvait lire en multiples des octets utilisés pour l'encodage.

Par exemple, pour un codage UTF-8 (2 octets) chaîne si vous avez besoin du premier caractère de la chaîne

$string = 'žščř'; //4 multi-byte characters in UTF-8 

Vous devez obtenir la chaîne de $ [0] et $ string valeurs [1] , donc vous recherchez réellement la sous-chaîne entre les index 0 et 1 (pour le premier caractère).

Notez que $ string [0] ou $ string [N] fera référence à la première (ou Nième octet de la chaîne multi-octets)

salutations

+0

Serait pas difficile de savoir combien d'octets je dois lire? C'est un exemple trivial, mais en général je ne sais pas quels caractères sont sur l'entrée (les caractères UTF-8 peuvent avoir entre 1 et 4 octets). –

+0

Oui, vous devez déterminer le nombre d'octets utilisés, mais c'est une réponse qui peut vous donner des informations sur l'utilisation des fonctions NON mb_related - et la manipulation de chaînes multi-octets. J'espère que vous le trouverez utile. – Andreas

+0

Cette réponse est trompeuse car elle suggère que tous les caractères UTF-8 ont une longueur de 2 octets. En fait, l'octet dépend du caractère représenté. Comme @PetrPeller noté dans le commentaire ci-dessus, les caractères UTF-8 peuvent occuper aussi peu que 1 octet, ou jusqu'à 4 octets. – Lee

Questions connexes