Erkennen EOL - - Typ mit PHP
Referenz: Dies ist ein selbst-beantwortete Frage. Es war dazu gedacht, die Kenntnisse zu teilen, F&Ein Stil.
Wie erkenne ich die Art der end-of-line Zeichen in PHP?
PS: ich habe das schreiben von Grund auf für zu lange jetzt, so dass ich beschloss, es zu teilen SO, außerdem bin ich sicher, dass jemand Wege finden zur Verbesserung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweise:
Muss irgendwie wissen, dass wir möglicherweise auf ein exotisches system wie ZX8x (ASCII x76 ist ein regulärer Brief)@radu hob ein guter Punkt, in meinem Fall, es ist nicht der Mühe Wert, zu behandeln ZX8x Systeme schön.mb_detect_eol()
(multibyte) unddetect_eol()
0A
erscheint zweimal. @Alexander Der Quelle verknüpft ist die Frage. Christian wollte nur eine Frage stellen, dass er will, um die Antwort selbst.\r\n
ist ASCII CR+LF (Windows). Wenn es nicht klar, mein code soll zu finden EOL der eine beliebige Zeichenfolge, auch wenn es kam von einem anderen server -, client-oder eine remote-Datenbank. PHP ist völlig blind gegenüber dem, was Ihre client-browser als EOL.0x1E
,0x76
und0x15
können nicht Teil eines multibyte-Zeichens? Vielleicht wäre es eine gute Idee sein, lassen Sie diese aus, wenn Sie nicht überzeugt sind, dass Sie gehen, um nützlich zu sein (die OSs erwähnt ganz schön alt Aussehen).U+1E9E
. Wenn das Dokument enthalten würde, dieser Charakter, würde der code zu dem Schluss, es enthält ein EOL anstelle des "scharfen s" - Zeichen, denn Sie suchen0x1E
, die Teil des "scharfen s" - Zeichen.Wäre es nicht einfacher einfach zu ersetzen alles außer die neuen Linien mit regex?
Mit, dass im Auge, wir tun etwas Magie:
Nicht sicher, ob wir Vertrauen können regex um all dies zu tun, aber ich habe nichts zum testen mit.
$arr = array_count_values(str_split($newlines));arsort($arr);return key($arr);
Den hier bereits gegebenen Antworten bieten dem Anwender genug Informationen.
Der folgende code (basierend auf dem bereits gegebenen anwers) könnte noch mehr helfen:
Ich hoffe, dies ist der Verwendung von Ihnen allen.
dann verwenden Sie den folgenden code in eine statische Utility-Klasse zu erkennen
dann für eine Datei:
Ändern Sie die Ihre-Class-Name in Ihrem Namen für die Implementierung der Klasse (alle static-member).
Meine Antwort, denn ich konnte weder ohaal's ein oder transilvlad's eine Arbeit ist:
Erklärung:
Die Allgemeine Vorstellung in der sowohl die vorgeschlagenen Lösungen ist gut, aber die Umsetzung details behindern den nutzen von den Antworten.
In der Tat, der Sinn dieser Funktion ist die Rückgabe der Art von Zeilenumbruch verwendet wird in einer Datei, und , dass newline können entweder ein oder zwei Zeichen lang.
Allein dies macht die Verwendung von
str_split()
falsch. Der einzige Weg, um schneiden Sie das Token korrekt ist die Verwendung einer Funktion, die schneidet einen string mit Variablen Längen, basierend auf Charakter-Erkennung statt. Das ist, wennexplode()
ins Spiel kommt.Sondern geben nützliche Marker zu explodieren, ist es notwendig, ersetzen Sie die richtigen Zeichen in der richtigen Menge, der richtigen match. Und die meisten der Magie passiert in dem regulären Ausdruck.
3 Punkte müssen berücksichtigt werden:
.*
wie vorgeschlagen von ohaal wird nicht funktionieren. Während es wahr ist, dass.
nicht entsprechen, werden Zeilenvorschub-Zeichen auf einem system, wo\r
ist nicht ein newline-Zeichen, oder ein Teil einer neue-Zeile-Zeichen,.
es passen wird falsch (Erinnerung: wir sind die Erkennung von Zeilenumbrüchen, denn Sie könnte anders sein als die, die auf unser system. Ansonsten gibt es keinen Punkt)./[^\r\n]*/
mit etwas "arbeiten", um den text verschwinden, wird aber ein Problem, sobald wir Sie haben wollen, einen separator (da wir entfernen Sie alle Zeichen, aber die Zeilenumbrüche, alle Zeichen, die nicht einem Zeilenumbruch wird ein Gültiger separator). Daher die Idee, ein Spiel mit dem newline, und verwenden Sie einen Rückverweis auf, dass match in den Ersatz.Basierend auf ohaal Antwort.
Diese zurückkehren können ein oder zwei Woerter für EOL-wie LF, CR+LF..