PHP: preg_split mit nicht darstellbarem Zeichen als Trennzeichen

klausschreiber

Well-known member
ID: 162475
L
6 Mai 2006
247
8
Hallo,

ich habe einen String, der auch nicht darstellbare Zeichen enthält. Diesen will ich in ein Array aufteilen.

Erstmal ein Beispiel mit darstellbaren Zeichen:
BamboQQdas ist ein testQklausQQhallo, wie gehtsQmichiQQdas ist tollQ
soll in Folgendes umgewandelt werden:
Code:
Array (     [0] => BamboQQdas ist ein test     [1] => klausQQhallo, wie gehts     [2] => michiQQdas ist toll )
Bei jedem "Q" wird der Text aufgeteilt und zwar nur bei genau einem "Q". Dies funktioniert folgendermaßen einwandfrei:
PHP:
$string = "BamboQQdas ist ein testQklausQQhallo, wie gehtsQmichiQQdas ist tollQ";
$regexp = "/(?<!Q)Q(?!Q)/";
$array = preg_split($regexp, $string, -1, PREG_SPLIT_NO_EMPTY);
print_r($array);
Das Problem ist aber, dass das Trennzeichen, das ich benötige, leider kein einfaches "Q" ist, sondern das nicht darstellbares Hexdezimalzeichen "00". Der String, den ich teilen möchte, konmmt von einer Datei, die vorher hochgeladen wird, aber das ist ja im Grunde egal. Mein erster Versuch sah folgendermaßen aus:
PHP:
// Funktion, die mir hexdezimale Zeichen in normale Zeichen umwandelt
function hex2bin($hex) {
    $dec = hexdec($hex); // Umwandlung Von Hexdezimal zu Dezimal
    $bin = chr($dec); // Rueckgabe des entsprechenden Ascci-Zeichens
    return $bin;
}

$delimiter = hex2bin("00"); // Das Hexdezimalzeichen "00" wird umgewandelt

$regexp = "/(?<!" . $delimiter . ")" . $delimiter . "(?!" . $delimiter . ")/"; // regulärer Ausdruck mit dem Hexzeichen "00" anstatt Q
$array = preg_split($regexp, $file, -1, PREG_SPLIT_NO_EMPTY);
print_r($array);
Der Versuch gab jedoch folgende Fehlermeldung:
Warning: preg_split() [function.preg-split]: No ending delimiter '/' found in D:\Programmierung\Web\eigene_Projekte\Poker\Komponenten\notekonverter\index.php on line 29
(Zeile 29 ist das "$array = preg_split ..."

Über Google habe ich dann herausgefunden, dass man in regulären Ausdrücken anscheinend auch hexdezimalzeichen in folgender Form verwenden kann: "\xnn".
Daraufhin habe ich es mit folgendem regulären Ausdruck versucht:
PHP:
$regexp = "/(?<!\x00)\x00(?!\x00)/"
Die Fehlermeldung war jedoch die selbe. Auch die Einschließung des regulären Ausdrucks in andere Zeichen als "/" brachte kein Erfolg. (z.B.
PHP:
$regexp = "%(?<!\x00)\x00(?!\x00)%"


Ich würde mich sehr freuen, wenn jemand weiß, was da falsch ist, bzw. wie ich es richtig machen muss.

Gruß,
Klaus
 
x00 ist doch meine ich das Nullbyte, un in C++ beendet das den String, vllt wird der RegExp auch an der Stelle beendet.
Würde ich an deiner Stelle mal genauer nach suchen ;)
 
vielen Dank, das war genau die Lösung:D.
Für die, die es interessiert:
4. How to use a binary zero in regular expressions.
Sometimes we have to process binary data files with regular expressions. It is not unheard of to meet a binary zero in such data. In a C-like string the binary zero "\x00" would be considered as the end of line character. So to use a binary zero in a regular expression, we have to write it like that: "\\x00". I.e. we have to escape with a backslash.
(Quelle: https://www.skdevelopment.com/php-regular-expressions.php)

So funktioniert es nun:
PHP:
$regexp = "/(?<!\\x00)\\x00(?!\\x00)/";