2010-04-07 29 views
6

Me gustaría escribir un analizador (HTML) basado en la máquina de estados, pero tengo dudas sobre cómo leer/usar una entrada. Decidí cargar toda la entrada en una cadena y luego trabajar con ella como con una matriz y mantener su índice como la posición actual de análisis.Analizando cadena multibyte en PHP

No habría problemas con la codificación de un solo byte, pero en la codificación de múltiples bytes, cada valor no representa un carácter, sino un byte de un carácter.

Ejemplo:

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

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

Salidas:

Ĺ 
ž 
Ĺ 
Ą 

Esto significa que no puede iterar a través de la cadena en un bucle para comprobar los caracteres individuales, porque nunca sé si estoy en el medio de un personaje o no.

Así que las preguntas son:

  • ¿Cómo se trabaja con múltiples bytes a leer un carácter único de una cadena de una manera amigable rendimiento?
  • ¿Es una buena idea trabajar con la cadena ya que era una matriz en este caso ?
  • ¿Cómo leerías la entrada?

Respuesta

2

http://php.net/mb_string es lo que estás buscando

  • caracteres simplemente mb_substr uno por uno
  • no
  • hasta PHP6
  • lo que de entrada exactamente? La forma más habitual, en general
+2

Tenga en cuenta que la sección de comentarios para 'mb_split' incluye muchos ejemplos de cómo dividir una cadena multibyte en una matriz de caracteres, por ejemplo, http://us2.php.net/manual/en/function.mb-split.php#80046 – Amber

+0

@Dav I don ' Creo que realmente necesita una matriz. –

+0

por entrada me refiero al código HTML para analizar. Tal vez hay una manera completamente diferente de usar la cadena con la máquina de estado que me falta :-) ...pero el mb_substr se ve bien (si conozco la codificación de cadena, que no es tan obvio) –

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

Sin utilizar las mdb_relatedFunctions y con las secuencias codificadas de múltiples bytes puede utilizar las funciones de sub cadena estándar que se leen en los múltiplos de bytes utilizados para la codificación.

por ejemplo para una codificación UTF-8 (2 bytes) del hilo, si usted necesita el primer carácter de la cadena

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

Tienes que conseguir que la cadena $ [0] y valores $ string [1] , de modo que en realidad está buscando la subcadena entre los índices 0 y 1 (para el primer carácter).

Tenga en cuenta que $ string [0] o cadena $ [N] hará referencia a la primera (o enésimo byte de la cadena de múltiples bytes)

respecto,

+0

¿No sería muy difícil saber cuántos bytes tengo que leer? Este es un ejemplo trivial, pero en general no sé qué caracteres están en la entrada (los caracteres UTF-8 pueden tener entre 1 y 4 bytes). –

+0

Sí, debe determinar cuántos bytes se utilizan, pero es una respuesta que podría brindarle cierta información sobre el uso de las funciones NON mb_related y la manipulación de cadenas de múltiples bytes. Esperamos que te sea útil. – Andreas

+0

Esta respuesta es engañosa porque sugiere que todos los caracteres UTF-8 tienen una longitud de 2 bytes. Cuando, de hecho, la longitud del byte depende del personaje representado. Como @PetrPeller señaló en el comentario anterior, los caracteres UTF-8 pueden ocupar tan poco como 1 byte, o hasta 4 bytes. – Lee