2016-05-08 7 views
0

Kann jemand diese seltsame Situation in PHP erklären? Hier ist ein Beispiel.DOM XML String ersetzen Bug

Ich habe Zeichenfolge: "Olbrachtova 10". Ich möchte Komma vor Nummer hinzufügen und Leerzeichen vor Komma entfernen. Also wird das Ergebnis sein.

"Olbrachtova, 10"

Diese Zeichenfolge muss in XML geschrieben werden, und ich bin mit DOMDocument Bibliothek.

Ich verwende diesen Code:

Funktion Position der ersten Reihe zu finden (funktioniert gut):

private function findOffset($text){ 
     preg_match('/^\D*(?=\d)/', $text, $m); 
     return isset($m[0]) ? strlen($m[0]) : false; 
} 

Funtion Zeichen in Zeichenfolge einzufügen (funktioniert gut auch)

private function stringInsert($str,$insertstr,$pos) 
{ 
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos); 
    return $str; 
} 

Und hier ist das endgültige Skript

Nach dieser Verarbeitung versuche ich letzte Zeichenfolge anfügen, die "Olbrachtova, 10" zu XML ist.

var_dump($address); 

//return 

string(15) "Olbrachtova, 10" 

Und hier ist letzte Zeile

$parcel->appendChild($xml->createElement("Indirizzo", $address)); 

Ausgang dieses wird anhängen:

<Indirizzo>Olbrachtova</Indirizzo> 

Es ist immer vor dem Komma brechen, in dem Ort, wo ich Raum mit

entfernt
$address[$numberPosition - 1] = ''; 

WARUM?

Aber wenn ich das bin mit Platz

$address = substr_replace($address,'',$numberPosition - 1,1); 

funktioniert super Alles zu entfernen. Kann jemand erklären, warum die erste Methode nicht funktioniert hat?

EDIT

Hier vollständige Code

<?php 


function findOffset($text){ 
     preg_match('/^\D*(?=\d)/', $text, $m); 
     return isset($m[0]) ? strlen($m[0]) : false; 
} 

function stringInsert($str,$insertstr,$pos) 
{ 
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos); 
    return $str; 
} 


$xml = $dom = new DOMDocument('1.0', 'UTF-8'); 
$xml->preserveWhiteSpace = false; 
$xml->formatOutput = true; 

//main element for soap request 
$mainSection = $xml->createElement("Info"); 

$parcel = $xml->createElement("Parcel"); 



//string to change 
$address = "Olbrachtova 10"; 

//position of first number 
$numberPosition = findOffset($address); 

if ($numberPosition){ 

    //remove space before number if exists 
    if($address[$numberPosition - 1] == ' '){ 

     //remove space - HERE IS PROBLEM 
     $address[$numberPosition - 1] = ''; 

     //find new position of number 
     $numberPosition = findOffset($address); 
    } 

    //add comma before number 
    $address = stringInsert($address,", ",$numberPosition); 

}else{ 
    //if string has no number return false - is invalid 
    return false; 
} 

$parcel->appendChild($xml->createElement("Indirizzo", $address)); 

var_dump($address); 


//append Package 
$mainSection->appendChild($parcel); 

//append whole xml to main 
$xml->appendChild($mainSection); 

$output = $xml->saveXML(); 

print_r($output); 

?> 

Und Sie können es hier testen: http://phptester.net/

+0

Bitte fügen Sie den vollständigen Quellcode von PHP-Skript nicht $string[$index] = ""; unter keinen Umständen schreiben:

Lösung. Sie können auch 'var_dump()' verwenden, um die Variablenwerte während der Ausführung Ihres PHP-Skripts auszugeben, um zu sehen, wie die Werte geändert werden. – Progman

+0

Beitrag bearbeitet, Sie können es versuchen .. Ich denke, dass es Fehler in DOMDocument-Bibliothek ist – 3y3skill3r

Antwort

2

Das Problem ist, dass Sie die leere Zeichenkette "" in einen String-Index zuweisen. Dies führt dazu, dass das NULL-Byte an dieser Stelle geschrieben wird. Von der PHP-Handbuch über strings:

Warnung Schreiben in einem außerhalb des Bereichs Offset-Pads die Zeichenfolge mit Leerzeichen. Nicht ganzzahlige Typen werden in Ganzzahlen konvertiert. Illegaler Offset-Typ gibt E_NOTICE aus. Negativer Offset gibt E_NOTICE in write aus, liest aber eine leere Zeichenfolge. Nur das erste Zeichen einer zugewiesenen Zeichenfolge wird verwendet. Die Zuweisung einer leeren Zeichenfolge weist NULL-Byte zu.

Und das NULL-Byte markiert das Ende einer Zeichenfolge in C/C++ intern. Das ist der Grund, warum die Methode createElement nur den Wert "Olbrachtova" in das XML-Element schreibt, egal wie die Zeichenkette in PHP aussieht.

0

das Beispiel Break down auf die DOM-Funktionen mit statischen Strings. Versuche zu reproduzieren. Vielleicht hast du vorher einen Fehler. Verwenden Sie außerdem nicht das zweite Argument DOMDocument::createElement() - es ist nicht Teil des DOM-Standards. Hier ist eine bug, die das XML brechen kann. Es sollte nicht von dem von Ihnen bereitgestellten Beispiel ausgelöst werden, aber es ist sicherer, den Textknoten zu erstellen und anzufügen.

$document = new DOMDocument(); 
$document 
    ->appendChild($document->createElement("Indirizzo")) 
    ->appendChild($document->createTextNode("Olbrachtova, 10")); 

echo $document->saveXml(); 

Ausgang:

<?xml version="1.0"?> 
<Indirizzo>Olbrachtova, 10</Indirizzo> 
+0

Ich habe versucht, hat überhaupt nicht funktioniert ... – 3y3skill3r