2009-07-15 6 views
3

Ich baue eine XML-RSS für meine Seite. Und läuft in diesen Fehler:Converting & zu & für XML in PHP

error on line 39 at column 46: xmlParseEntityRef: no name 

Offenbar ist dies, weil ich & in XML haben kippe ... Was ich in meiner letzten Feld Reihe tun ...

Was ist der beste Weg, um alle zu reinigen meine nur th zu kodieren genannt $row['field']'s in PHP, so dass & drehen ‚s in &

Antwort

8

Verwenden htmlspecialchars e HTML-Sonderzeichen &, <, >, " und optional ' (siehe zweiter Parameter $quote_style).

1
+3

XML Teilen nicht alle den gleichen Namen * * Entitäten als HTML - nur 5 vordefinierten Entitäten aufweist (amp, lt, gt, quot und apos). Es sei denn, das XML-Dokument enthält eine DTD, die alle benannten HTML-Entitäten enthält, wobei htmlentities() verwendet wird, die einige Zeichen in Entitäten konvertieren können, die ein XML-Parser nicht unterstützen muss. –

+0

Was ist also am besten zu verwenden? – ian

+0

@ian: Gegeben Gumbo Beschreibung von 'htmlspecialcharacters()', würde ich damit gehen (wie es nur die 5 Zeichen mit vordefinierten Entitäten in XML berührt) –

0

Verwenden

html_entity_decode($row['field']); 

zum & von & auch, dass es, wenn Sie &npsb; haben diese nehmen und wieder zurück in einen Raum verändern.

http://us.php.net/html_entity_decode

Prost

+0

Nicht sicher, warum ich zurückkehren möchte ... Dies ist für eine RSS Futter. – ian

2

Wirklich sollte in php in den dom xml Funktionen suchen. Es ist ein bisschen Arbeit, um herauszufinden, aber Sie vermeiden solche Probleme.

+0

Wie so? Zeige mir etwas und ich werde es herausfinden. – ian

1

Convert Reservierte XML Zeichen Entities

function xml_convert($str, $protect_all = FALSE) 
{ 
    $temp = '__TEMP_AMPERSANDS__'; 

    // Replace entities to temporary markers so that 
    // ampersands won't get messed up 
    $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); 

    if ($protect_all === TRUE) 
    { 
     $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); 
    } 

    $str = str_replace(array("&","<",">","\"", "'", "-"), 
         array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "&#45;"), 
         $str); 

    // Decode the temp markers back to entities 
    $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); 

    if ($protect_all === TRUE) 
    { 
     $str = preg_replace("/$temp(\w+);/","&\\1;", $str); 
    } 

    return $str; 
}