Analisi stringa multibyte in PHP
Domanda
Vorrei scrivere un parser (HTML) sulla base di macchina a stati, ma ho dei dubbi come leggere acctually / utilizzare un ingresso. Decisi di caricare l'intera ingresso in una stringa e poi lavorare con esso come con un array e mantenere la sua posizione di indice come analisi corrente.
Non sarebbe problemi con codifica a singolo byte, ma in multi-byte codificano 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 iterate attraverso la stringa in un ciclo per controllare singoli caratteri, perché non so mai se io sono nel bel mezzo di un carattere o meno.
Quindi le domande sono:
- Come faccio sicurezza multi-byte leggere un singolo carattere da una stringa in un prestazioni modo amichevole?
- E 'buona idea di lavorare con il stringa come fosse una matrice in questo caso?
- Come vi leggere l'input?
Soluzione
http://php.net/mb_string è la cosa che stai cercando
- solo personaggi mb_substr uno per uno
- non fino php6
- che cosa esattamente ingresso? Il solito modo, in generale
Altri suggerimenti
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/>");
}
Senza usare i mdb_relatedFunctions e con più byte stringhe codificate è possibile utilizzare le funzioni standard sottostringa che leggono in multipli del byte utilizzati per la codifica.
Ad esempio per una stringa UTF-8 codificato (2 byte) se necessario il primo carattere dalla stringa
$string = 'žščř'; //4 multi-byte characters in UTF-8
Si deve ottenere la stringa $ [0] e $ string [1] valori, quindi in realtà si sta cercando la sottostringa tra gli indici 0 e 1 (per il primo carattere).
Si noti che $ string [0] o $ string [N] farà riferimento il primo (o l'ennesimo byte della stringa multi-byte)
saluti,