2010-04-07 14 views
6

Vorrei scrivere un parser (HTML) basato su macchina a stati, ma ho dei dubbi su come leggere/utilizzare un input. Ho deciso di caricare l'intero input in una stringa e quindi lavorare con esso come con un array e mantenere il suo indice come posizione di analisi corrente.Parsing multibyte string in PHP

Non ci sarebbero problemi con la codifica a byte singolo, ma nella codifica multibyte ogni valore non rappresenta un carattere, ma un byte di un carattere.

Esempio:

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

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

Uscite:

Ĺ 
ž 
Ĺ 
Ą 

Questo significa che non posso scorrere la stringa in un ciclo per controllare singoli caratteri, perché non so mai se mi trovo in al centro di un personaggio o no.

Quindi le domande sono:

  • Come posso sicuro multi-byte leggere un carattere singolo da una stringa in modo amichevole prestazioni?
  • È consigliabile lavorare con la stringa come se fosse una matrice in questo caso ?
  • Come leggeresti l'input?

risposta

2

http://php.net/mb_string è la cosa che stai cercando

  • caratteri appena mb_substr uno per uno
  • non
  • fino php6
  • quello di ingresso esattamente? Il modo usuale in generale
+2

Nota che la sezione commenti per 'mb_split' ci sono molti esempi su come suddividere una stringa multibyte in una serie di caratteri - ad esempio, http://us2.php.net/manual/en/function.mb-split.php#80046 – Amber

+0

@Dav I don ' Penso che abbia davvero bisogno di un array. –

+0

per input intendo il codice HTML da analizzare. Forse c'è un modo assolutamente diverso di usare la stringa con la macchina a stati che mi manca :-) ...ma mb_substr sembra a posto (se conosco la codifica della stringa, che non è così ovvia) –

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

Senza usare i mdb_relatedFunctions e con più byte stringhe codificate è possibile utilizzare le funzioni standard sottostringa che leggono multipli di byte utilizzati per la codifica.

ad esempio per un UTF-8 codificati (2 byte) stringa se è necessario il primo carattere della stringa di

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

Dovete ottenere la stringa $ [0] e [1] valori $ string , quindi stai cercando la sottostringa tra gli indici 0 e 1 (per il primo carattere).

Nota che $ string [0] o $ string [N] farà riferimento il primo (o l'ennesimo byte della stringa multi-byte)

saluti,

+0

Non sarebbe abbastanza difficile sapere quanti byte devo leggere? Questo è un esempio banale, ma in generale non so quali caratteri siano presenti sull'input (i caratteri UTF-8 possono essere lunghi 1-4 byte). –

+0

Sì, è necessario determinare quanti byte vengono utilizzati, ma è una risposta che potrebbe fornire alcune informazioni sull'utilizzo delle funzioni NON mb_related e sulla manipolazione di stringhe multi-byte. Spero che tu lo trovi utile – Andreas

+0

Questa risposta è fuorviante perché suggerisce che tutti i caratteri UTF-8 sono lunghi 2 byte. In effetti, la lunghezza del byte dipende dal carattere rappresentato. Come notato da @PetrPeller nel commento sopra, i caratteri UTF-8 possono occupare un minimo di 1 byte o fino a 4 byte. – Lee