php explode
claus ginsel
- php
Guten Morgen
ich stolpere gerade über explode, angewendet auf eine xml-Struktur.
zB wollte ich <name> und </name> als Trennzeichen nehmen und musste aber feststellen, dass nur Blödsinn rauskommt, weil, wie ich mir jetzt selbst erklärt habe, ohne einen Hinweis in der Doku auf php.net zu finden, < und > ersetzt werden durch nix?!
Ersetze ich im Vorfeld die < und > durch zB ( und ), dann funktioniert das Konstrukt.
Sind + im String enthalten, werden diese ebenfalls rausgehauen und durch Leerzeichen ersetzt.
Kann mir jemand eine Quelle benennen, wo ich dieses Verhalten von explode dokumentiert finde?
Gruß Claus
Moin Claus,
ich stolpere gerade über explode, angewendet auf eine xml-Struktur.
zB wollte ich <name> und </name> als Trennzeichen nehmen und musste aber feststellen, dass nur Blödsinn rauskommt, weil, wie ich mir jetzt selbst erklärt habe, ohne einen Hinweis in der Doku auf php.net zu finden, < und > ersetzt werden durch nix?!
Kannst du bitte ein Beispiel zeigen?
Ersetze ich im Vorfeld die < und > durch zB ( und ), dann funktioniert das Konstrukt.
Sind + im String enthalten, werden diese ebenfalls rausgehauen und durch Leerzeichen ersetzt.
Das liest sich nach URL-Dekodierung? Passiert in deinem Code noch mehr als nur explode
?
Kann mir jemand eine Quelle benennen, wo ich dieses Verhalten von explode dokumentiert finde?
Die PHP-Dokumentation (von explode
) ist meines Wissens vollständig.
Viele Grüße
Robert
Hallo,
Die PHP-Dokumentation (von
explode
) ist meines Wissens vollständig.
mu. Das halte ich für unmöglich.
Sie enthält vielleicht alles, was die Dokumentierenden für dokumentationswürdig halten. Aber vollständig? Niemals.
Beispiel „explode“: separator ist ein $string. Gezeigt werden aber nur Beispiele in denen separator ein $zeichen ist.
Ob und wenn ja, welchen Unterschied das macht, darf $user selber ausprobiern.
Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.
Gruß
Kalk
Hallo Kalk
Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.
nacheinander in einer Kaskade
Gruß Claus
Moin Kalk,
Die PHP-Dokumentation (von
explode
) ist meines Wissens vollständig.mu. Das halte ich für unmöglich.
Sie enthält vielleicht alles, was die Dokumentierenden für dokumentationswürdig halten. Aber vollständig? Niemals.
Wieso sollte die „niemals vollständig“ sein? Eine Funktion ist doch klar definiert (selbst in C, wo Funktionen im Fehlerfall „undefiniertes Verhalten“ zeigen).
Beispiel „explode“: separator ist ein $string. Gezeigt werden aber nur Beispiele in denen separator ein $zeichen ist.
Ob und wenn ja, welchen Unterschied das macht, darf $user selber ausprobiern.
Was ist denn in deiner Nomenklatur der Unterschied zwischen einem Zeichen und einem String?
Jedenfalls scheint es nicht vorgesehen zu sein, zwei unterschiedliche Separatoren zu haben.
Laut Dokumentation hat jeder Funktionsaufruf genau einen Separator, das ist IMHO eindeutig.
Viele Grüße
Robert
@@Robert B.
Was ist denn in deiner Nomenklatur der Unterschied zwischen einem Zeichen und einem String?
In meiner: Ein Zeichen ist ein Element des Zeichensatzes (i.a.R. Unicode). Ein String ist eine Aneinanderreihung von 0 bis n Zeichen.
🖖 Живіть довго і процвітайте
PS. echo strlen('ä'); // 2
😆
PS.
echo strlen('ä'); // 2
😆
Nicht wenn Du das mit dem selig gesprochenem HTML-Editor und also mit einer ISO-Kodierung speicherst… Aber zeigen wir doch etwas mehr:
<?php
echo 'mb_internal_encoding( \'UTF-8\' );' . PHP_EOL;
mb_internal_encoding( 'UTF-8' );
$string = 'ä';
echo ' $string = \'' . $string . '\'' . PHP_EOL;
echo " strlen( '$string' ) : " . strlen( $string ) . PHP_EOL;
echo " mb_strlen( '$string' ) : " . mb_strlen( $string ) . PHP_EOL;
echo "iconv_strlen( '$string' , 'UTF-8') : " . iconv_strlen( $string ) . PHP_EOL;
echo ' $string[0] : ' . $string[0] . PHP_EOL;
echo '$arr = mb_split( \'\', \'' . $string . '\', 1 )' . PHP_EOL;
$arr = mb_split( '', $string, 1 );
echo ' $arr[0] : ' . $arr[0] . PHP_EOL;
/tmp > php test.php
mb_internal_encoding( 'UTF-8' );
$string = 'ä'
strlen( 'ä' ) : 2
mb_strlen( 'ä' ) : 1
iconv_strlen( 'ä' , 'UTF-8') : 1
$string[0] : �
$arr = mb_split( '', 'ä', 1 )
$arr[0] : ä
@@Raketenwilli
PS.
echo strlen('ä'); // 2
😆Nicht wenn Du das mit dem selig gesprochenem HTML-Editor und also mit einer ISO-Kodierung speicherst…
Das hat nichts mit Editor oder Codierung zu tun, sondern damit, dass die in der PHP-Doku unter „Stringfunktionen“ gelisteten Funktionen keine Stringfunktionen sind. Stringfunktionen fangen in PHP mit mb_
an.
🖖 Живіть довго і процвітайте
PS: Zum Vergleich JavaScript:
Stringfunktionen fangen in PHP mit
mb_
an.
Naja. Die Doku sieht das anders. Sagen wir:
„Anno 2022 brauchbare Stringfunktionen fangen in PHP mit mb_
an.“
echo ord( 'ä' ); #: 195
echo mb_ord( 'ä', 'UTF-8' ); #: 228
Moin Robert
Das liest sich nach URL-Dekodierung? Passiert in deinem Code noch mehr als nur explode?
ja 😉
Der zu trennende String wird zuvor per Ajax übertragen:
xhttp.open("POST", "new_ajax.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
Ich danke Dir, Robert
Der zu trennende String wird zuvor per Ajax übertragen:
xhttp.open("POST", "new_ajax.php", true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
Das ist aber Javascript.
Du sollst aber herzeigen was mit welchen Daten gemacht wird und klar zeigen, was Du erwartest:
Also gehe in der new_ajax.php an geeigneter Stelle folgende Schritte:
<?php
$string = ...
var_dump( $string );
$arr = explode( ..., ... );
var_dump( $arr );
...
Die Auslassungen musst Du selbst ersetzen. Teste und zeige nach jedem Schritt einzeln durch Ausgabe der Parameter der Funktionen und deren Ausgaben (Returns). Überprüfe, wo und wann etwas auftaucht, was Deinen Vorstellungen nicht entspricht.
Falls Du das im Browser betrachtest, dann zeige den Quelltext, nicht das, was dieser aus dem vermeintlichen HTML macht.
@@claus ginsel
ich stolpere gerade über explode, angewendet auf eine xml-Struktur.
Leider lässt du uns an deinen Gehversuchen nicht teilhaben. Es fehlt die Problembeschreibung: Was versuchst du? Und warum? Was ist dein Ziel?
Du möchtest XML parsen? Dann ist explode
(Stringfunktionen, reguläre Ausdrücke) das Problem, nicht die Lösung. Wenn du einen Parser willst, willst du einen Parser.
🖖 Живіть довго і процвітайте
Moin Gunnar
ich brauche keinen Parser. ich will lediglich ein paar Daten in einer festen Struktur verpackt versenden. Und da XML so allgegenwärtig ist, nahm ich als Struktur halt sowas ähnliches. Kann auch was ganz anderes sein.
Gruß Claus
Hallo claus,
ich brauche keinen Parser
Möglicherweise nicht, aber wenn Du XML einlesen willst, brauchst Du keinesfalls Stringfunktionen (wozu ich explode und preg_match jetzt hinzurechne). XML ist eine komplexe Struktur, in der die strukturgebenden Zeichen möglicherweise maskiert vorkommen, und dafür ist ein Tool erforderlich, das sich damit auskennt. Andernfalls rennst Du mit deinem Eigengewächs irgendwann vor die Pumpe, oder programmierst die fertigen Libraries am Ende nach. Einfachere Alternativen zu XMLParser und den zugehörigen Funktionen habe ich in einem anderen Posting gelistet.
Und du möchtest XML nicht lesen, sondern schreiben? Dann füge ich meiner Liste noch einen Writer hinzu.
Wenn es Dir nicht auf XML ankommt, gibt's auch noch JSON.
Wer ist der Empfänger? Wieder PHP? Dann käme auch eine Serialisierung in Frage.
Was auch immer. Mach's nicht von Hand. Es gibt genügend Fertigprodukte.
Rolf
Moin Rolf
ich muss nicht XML nehmen.
Aber eines ist mir jetzt klar geworden: da die eigentlichen Daten auch Sonderzeichen enthalten können, sollte ich JSON zwischenschalten, der Datenfluss geht hier von Javascript zu PHP.
Danke für Deine Hinweise.
Gruß Claus
Moin Claus,
Aber eines ist mir jetzt klar geworden: da die eigentlichen Daten auch Sonderzeichen enthalten können, sollte ich JSON zwischenschalten, der Datenfluss geht hier von Javascript zu PHP.
Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.
Viele Grüße
Robert
Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.
Aber nur wenn Du das JSON „von Hand“ erzeugst. Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.
Moin,
Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.
Aber nur wenn Du das JSON „von Hand“ erzeugst.
Nein, das schreibst du ja selbst:
Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.
Viele Grüße
Robert
Moin,
Es gibt auch Sonderzeichen, die in JSON eine Behandlung erfordern.
Aber nur wenn Du das JSON „von Hand“ erzeugst.
Nein, das schreibst du ja selbst:
Alle Sprachen die ich kenne und die irgendwelche JSON-Funktionen anbieten, „behandeln“ die übergebenen Daten beim Kodieren/Dekodieren selbst.
Ich, als Ganzgenauheimer, stelle nur klar, dass man als Programmierer die Daten VOR einer Kodierung als JSON eben NICHT „behandeln“ muss. Deine Äußerung erweckt aber bei unbedarften Lesern den gegenteiligen Eindruck.
Hallo claus,
die eigentlichen Daten
sind die strukturiert? In dem Fall: JSON.stringify
Und beim POSTen nicht den Content-type x-www-form-urlencoded setzen, sondern application/json. Auslesen im PHP dann auch nicht über $_POST, sondern - nach Prüfung des eingegangenen Content-type, per stdin.
$data = json_decode(file_get_contents('php://input'), true);
Rolf
Hallo Gunnar,
Wenn du einen Parser willst, willst du einen Parser.
Oder vielleicht auch nur einen Reader
Oder was ganz simples
Oder lieber ein klassisches Dokument?
PHP bietet da eine ganze Ladung an Möglichkeiten.
Rolf