45 Stimmen

Generierung von XML-Dokument in PHP (Sonderzeichen entkommen)

Ich erstelle ein XML-Dokument aus einem PHP-Skript und muss die XML-Sonderzeichen escapen. Ich kenne die Liste der Zeichen, die escaped werden sollten; aber wie mache ich das korrekt?

Sollen die Zeichen einfach nur mit einem Backslash (\) escaped werden oder was ist der richtige Weg? Gibt es eine eingebaute PHP-Funktion, die das für mich erledigen kann?

0 Stimmen

@Tchalvak: Du liegst bei vielen Punkten, die du in deiner Beschreibung kritisierst, falsch. Ich habe versucht, dies mit den vorhandenen Antworten sichtbar zu machen, hoffe das ist hilfreich.

0 Stimmen

Ich habe in meiner Antwort nicht vorgeschlagen, die DOM-API nur für die Zeichenfolgenmaskierung zu verwenden. Ich schlug vor, dein gesamtes XML-Dokument mit dieser API zu generieren. Dies ist eine Antwort auf die Probleme, die du in deiner Beschreibung des bountys erwähnst.

0voto

Alois Cochard Punkte 9662

Sie können diese Methoden verwenden: http://php.net/manual/de/function.htmlentities.php

Auf diese Weise werden alle Entitäten (html/xml) maskiert und Sie können Ihren String innerhalb von XML-Tags platzieren

5 Stimmen

Dies ist eine schlechte Lösung, da HTML-Entities eine größere Menge als XML-Entities sind und die meisten XML-Parser viele HTML-Entities nicht erkennen werden, die nicht in der XML-Entities-Liste vorhanden sind.

-1voto

paderEpiktet Punkte 49

Basierend auf der Lösung von sadeghj hat der folgende Code bei mir funktioniert:

/**
 * @param $arr1 die einzelne Zeichenfolge, die maskiert werden soll
 * @return die resultierende Zeichenfolge mit den maskierten Zeichen
 */
function replace_char($arr1)
{
    if (strpos ($arr1,'&')!== FALSE) { //test if the character appears 
        $arr1=preg_replace('/&/','&', $arr1); // mache dies zuerst
    }

    // einfach codieren
    if (strpos ($arr1,'>')!== FALSE) {
        $arr1=preg_replace('/>/','>', $arr1);
    }
    if (strpos ($arr1,'<')!== FALSE) {
        $arr1=preg_replace('/

-2voto

sadeghj Punkte 29
 function replace_char($arr1)
 {
  $arr[]=preg_replace('>','>', $arr1); 
  $arr[]=preg_replace('<','<', $arr1);
  $arr[]=preg_replace('"','"', $arr1);
  $arr[]=preg_replace('\'','&apos', $arr1);
  $arr[]=preg_replace('&','&', $arr1);

  return $arr;
  }

5 Stimmen

Dies ist auf vielen Ebenen schlecht: (1) Es ist nicht notwendig, Regex für eine dumme Suchen-und-Ersetzen-Funktion zu verwenden. (2) Die Ersetzungswerte sind keine ordnungsgemäßen Entitäten (sie enden nicht mit einem Semikolon). (3) Sie erhalten für jede ersetzte Version ein Array separat. (4) Diese Strategie ist nicht einmal zukunftssicher; wollen Sie es jedes Mal aktualisieren, wenn sich die Spezifikation ändert? Ich habe keine Ahnung, wie das 4 Stimmen bekommen hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X