2010-04-07 8 views
6

Ich möchte einen (HTML) Parser basierend auf Zustandsmaschine schreiben, aber ich habe Zweifel, wie man eine Eingabe wirklich lesen/verwenden. Ich entschied mich, die gesamte Eingabe in eine Zeichenfolge zu laden und dann mit ihr wie mit einem Array zu arbeiten und ihren Index als aktuelle Parsing-Position zu halten.Parsing Multibyte Zeichenfolge in PHP

Es gibt keine Probleme mit der Ein-Byte-Kodierung, aber bei der Multi-Byte-Kodierung repräsentiert jeder Wert kein Zeichen, sondern ein Byte eines Zeichens.

Beispiel:

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

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

Ausgänge:

Ĺ 
ž 
Ĺ 
Ą 

Dies bedeutet, dass ich nicht durch den Strang in einer Schleife durchlaufen können einzelne Zeichen zu überprüfen, weil ich nie weiß, wenn ich bin in die Mitte eines Charakters oder nicht.

So sind die Fragen:

  • Wie kann ich Multi-Byte ein einzelnes Zeichen aus einer Zeichenkette in einer Leistung freundlich sicher lesen?
  • Ist es eine gute Idee mit dem String zu arbeiten, wie es ein Array in diesem Fall war?
  • Wie würden Sie die Eingabe lesen?

Antwort

2

http://php.net/mb_string ist das, was Sie

  • nur mb_substr Zeichen suchen sie sind eins nach dem anderen
  • erst PHP6
  • welche Eingabe genau? Der übliche Weg im Allgemeinen
+2

Beachten Sie, dass der Kommentarbereich für 'mb_split' Referenz Es enthält viele Beispiele dafür, wie man einen Multibyte-String in ein Array von Zeichen aufteilt - zum Beispiel http://us2.php.net/manual/en/function.mb-split.php#80046 – Amber

+0

@Dav I don ' Ich glaube, er braucht wirklich ein Array. –

+0

durch Eingabe ich meine den HTML-Code zu analysieren. Vielleicht gibt es einen völlig anderen Weg, wie man den String mit Zustandsmaschine benutzt, den ich vermisse :-) ...aber die mb_substr sieht gut aus (wenn ich die String-Codierung kenne, die nicht so offensichtlich ist) –

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

Ohne die mdb_relatedFunctions zu verwenden und mit Multi-Byte-kodierten Strings können Sie Standard-Sub-String-Funktionen verwenden, die für die Codierung verwendet, ein Vielfaches der gelesenen Bytes.

Zum Beispiel für ein UTF-8 codiert (2 Byte) string wenn Sie das erste Zeichen aus dem String

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

Sie haben die $ string to get [0] UND $ string [1] Werte Sie suchen also nach der Teilzeichenfolge zwischen den Indizes 0 und 1 (für das erste Zeichen).

Beachten Sie, dass $ string [0] oder $ string [N] wird die erste (oder N-ten Byte des Multi-Byte-String)

Grüßen,

+0

Wäre es nicht schwer zu wissen, wie viele Bytes ich lesen muss? Dies ist ein triviales Beispiel, aber im Allgemeinen weiß ich nicht, welche Zeichen an der Eingabe sind (UTF-8-Zeichen können 1-4 Byte lang sein). –

+0

Ja, Sie müssen bestimmen, wie viele Bytes verwendet werden, aber es ist eine Antwort, die Ihnen einige Informationen über die Verwendung der NON mb_related-Funktionen geben könnte - und die Manipulation von Multi-Byte-Strings. Ich hoffe, Sie finden es nützlich. – Andreas

+0

Diese Antwort ist irreführend, da sie vorschlägt, dass alle UTF-8-Zeichen 2 Byte lang sind. Tatsächlich ist die Bytelänge abhängig von dem darzustellenden Zeichen. Wie im obigen Kommentar von @PetrPeller angemerkt, können UTF-8-Zeichen nur 1 Byte oder bis zu 4 Byte belegen. – Lee