2010-09-16 10 views
6

Ich habe diese Funktion jeden img Tag hat absolute URL zu gewährleisten:Gibt es eine Möglichkeit, Entitäten intakt zu halten, während HTML mit DomDocument analysiert wird?

function absoluteSrc($html, $encoding = 'utf-8') 
{ 
    $dom = new DOMDocument(); 
    // Workaround to use proper encoding 
    $prehtml = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset={$encoding}\"></head><body>"; 
    $posthtml = "</body></html>"; 

    if($dom->loadHTML($prehtml . trim($html) . $posthtml)){ 
     foreach($dom->getElementsByTagName('img') as $img){ 
      if($img instanceof DOMElement){ 
       $src = $img->getAttribute('src'); 
       if(strpos($src, 'http://') !== 0){ 
        $img->setAttribute('src', 'http://my.server/' . $src); 
       } 
      } 
     } 

     $html = $dom->saveHTML(); 

     // Remove remains of workaround/DomDocument additions 
     $cut_start = strpos($html, '<body>') + 6; 
     $cut_length = -1 * (1+strlen($posthtml)); 
     $html = substr($html, $cut_start, $cut_length); 
    } 
    return $html; 
} 

Es funktioniert gut, aber es gibt decodierte Entitäten als Unicode-Zeichen

$html = <<< EOHTML 
<p><img src="images/lorem.jpg" alt="lorem" align="left"> 
Lorem ipsum dolor sit amet consectetuer Nullam felis laoreet 
Cum magna. Suscipit sed vel tincidunt urna.<br> 
Vel consequat pretium Curabitur faucibus justo adipiscing elit. 
<img src="others/ipsum.png" alt="ipsum" align="right"></p> 

<center>&copy; Dr&nbsp;Jekyll &#38; Mr&nbsp;Hyde</center> 
EOHTML; 

echo absoluteSrc($html); 

Ausgänge:

<p><img src="http://my.server/images/lorem.jpg" alt="lorem" align="left"> 
Lorem ipsum dolor sit amet consectetuer Nullam felis laoreet 
Cum magna. Suscipit sed vel tincidunt urna.<br> 
Vel consequat pretium Curabitur faucibus justo adipiscing elit. 
<img src="http://my.server/others/ipsum.png" alt="ipsum" align="right"></p> 

<center>© Dr Jekyll &amp; Mr Hyde</center> 

Wie Sie in der letzten Zeile

sehen können
  • & Kopie; wird übersetzt in © (U + 00A9),
  • & nbsp; bis zum schadfreien Raum (U + 00A0),
  • & # 38; bis & amp;

Ich möchte, dass sie gleich bleiben wie in Eingabezeichenfolge.

+0

Ich würde gerne die Antwort darauf auch wissen. Ich konvertierte schließlich &..; Entities zu ** ENTITY -...- ENTITY ** vor dem Parsen und Konvertieren zurück, nachdem es fertig ist. –

+1

Ich habe es vereinfacht, um nur amp 'str_replace ('&', '^ amp ^', $ html)', 'str_replace ('^ amp ^', '&', $ html)' zu ersetzen und es funktioniert, danke! Bitte posten Sie es als eine Antwort, so dass es akzeptiert werden kann, wenn es keine andere nicht-kluddy Weg –

+0

Vielleicht ist dies der Schuldige: http://nl2.php.net/manual/en/class.domdocument.php#domdocument.props .substituentities (wird in einem Moment getestet ...) – Wrikken

Antwort

0

Ich würde gerne die Antwort darauf auch wissen.

Ich endete Umwandlung & ..; Entities zu **ENTITY-...-ENTITY** vor dem Parsen und Konvertieren zurück, nachdem es fertig ist.

1

Der folgende Code scheint

$dom= new DOMDocument('1.0', 'UTF-8'); 
    $dom->loadHTML($this->htmlentities2stringcode(rawurldecode($content))); 
    $dom->preserveWhiteSpace = true; 

    $innerHTML = str_replace("<html></html><html><body>", "", 
    str_replace("</body></html>", "", 
str_replace("+","%2B",str_replace("<p></p>", "", $this->getInnerHTML($dom))))); 

    return $this->stringcode2htmlentities($innerHTML)); 
} 
// ---------------------------------------------------------- 
function htmlentities2stringcode($string) { 
    // This method will convert htmlentities such as &copy; into the pseudo string version ^copy^; etc 
     $from = array_keys($this->getHTMLEntityStringCodeArray()); 
     $to  = array_values($this->getHTMLEntityStringCodeArray()); 
    return str_replace($from, $to, $string); 
} 
// ---------------------------------------------------------- 
function stringcode2htmlentities ($string) { 
    // This method will convert pseudo string such as ^copy^ to the original html entity &copy; etc 
    $from = array_values($this->getHTMLEntityStringCodeArray()); 
    $to  = array_keys($this->getHTMLEntityStringCodeArray()); 
    return str_replace($from, $to, $string); 
    } 
    // ------------------------------------------------------------- 
    function getHTMLEntityStringCodeArray() { 

     return array('&Alpha;'=>'^Alpha^', 
            '&Beta;'=>'^Beta^', 
            '&Chi;'=>'^Chi^', 
            '&Dagger;'=>'^Dagger^', 
            '&Delta;'=>'^Delta^', 
            '&Epsilon;'=>'^Epsilon^', 
            '&Eta;'=>'^Eta^', 
            '&Gamma;'=>'^Gamma^', 
            '&Iota;'=>'^lota^', 
            '&Kappa;'=>'^Kappa^', 
            '&Lambda;'=>'^Lambda^', 
            '&Mu;'=>'^Mu^', 
            '&Nu;'=>'^Nu^', 
            '&OElig;'=>'^OElig^', 
            '&Omega;'=>'^Omega^', 
            '&Omicron;'=>'^Omicron^', 
            '&Phi;'=>'^Phi^', 
            '&Pi;'=>'^Pi^', 
            '&Prime;'=>'^Prime^', 
            '&Psi;'=>'^Psi^', 
            '&Rho;'=>'^Rho^', 
            '&Scaron;'=>'^Scaron^', 
            '&Scaron;'=>'^Scaron^', 
            '&Sigma;'=>'^Sigma^', 
            '&Tau;'=>'^Tau^', 
            '&Theta;'=>'^Theta^', 
            '&Upsilon;'=>'^Upsilon^', 
            '&Xi;'=>'^Xi^', 
            '&Yuml;'=>'^Yuml^', 
            '&Zeta;'=>'^Zeta^', 
            '&alefsym;'=>'^alefsym^', 
            '&alpha;'=>'^alpha^', 
            '&and;'=>'^and^', 
            '&ang;'=>'^ang^', 
            '&asymp;'=>'^asymp^', 
            '&bdquo;'=>'^bdquo^', 
            '&beta;'=>'^beta^', 
            '&bull;'=>'^bull^', 
            '&cap;'=>'^cap^', 
            '&chi;'=>'^chi^', 
            '&circ;'=>'^circ^', 
            '&clubs;'=>'^clubs^', 
            '&cong;'=>'^cong^', 
            '&crarr;'=>'^crarr^', 
            '&cup;'=>'^cup^', 
            '&dArr;'=>'^dArr^', 
            '&dagger;'=>'^dagger^', 
            '&darr;'=>'^darr^', 
            '&delta;'=>'^delta^', 
            '&diams;'=>'^diams^', 
            '&empty;'=>'^empty^', 
            '&emsp;'=>'^emsp^', 
            '&ensp;'=>'^ensp^', 
            '&epsilon;'=>'^epsilon^', 
            '&equiv;'=>'^equiv^', 
            '&eta;'=>'^eta^', 
            '&euro;'=>'^euro^', 
            '&exist;'=>'^exist^', 
            '&fnof;'=>'^fnof^', 
            '&forall;'=>'^forall^', 
            '&frasl;'=>'^frasl^', 
            '&gamma;'=>'^gamma^', 
            '&ge;'=>'^ge^', 
            '&hArr;'=>'^hArr^', 
            '&harr;'=>'^harr^', 
            '&hearts;'=>'^hearts^', 
            '&hellip;'=>'^hellip^', 
            '&image;'=>'^image^', 
            '&infin;'=>'^infin^', 
            '&int;'=>'^int^', 
            '&iota;'=>'^iota^', 
            '&isin;'=>'^isin^', 
            '&kappa;'=>'^kappa^', 
            '&lArr;'=>'^lArr^', 
            '&lambda;'=>'^lambda^', 
            '&lang;'=>'^lang^', 
            '&larr;'=>'^larr^', 
            '&lceil;'=>'^lceil^', 
            '&ldquo;'=>'^ldquo^', 
            '&le;'=>'^le^', 
            '&lfloor;'=>'^lfloor^', 
            '&lowast;'=>'^lowast^', 
            '&loz;'=>'^loz^', 
            '&lrm;'=>'^lrm^', 
            '&lsaquo;'=>'^lsaquo^', 
            '&lsquo;'=>'^lsquo^', 
            '&mdash;'=>'^mdash^', 
            '&minus;'=>'^minus^', 
            '&mu;'=>'^mu^', 
            '&nabla;'=>'^nabla^', 
            '&ndash;'=>'^ndash^', 
            '&ne;'=>'^ne^', 
            '&ni;'=>'^ni^', 
            '&notin;'=>'^notin^', 
            '&nsub;'=>'^nsub^', 
            '&nu;'=>'^nu^', 
            '&oelig;'=>'^oelig^', 
            '&oline;'=>'^oline^', 
            '&omega;'=>'^omega^', 
            '&omicron;'=>'^omicron^', 
            '&oplus;'=>'^oplus^', 
            '&or;'=>'^or^', 
            '&otimes;'=>'^otimes^', 
            '&part;'=>'^part^', 
            '&permil;'=>'^permil^', 
            '&perp;'=>'^perp^', 
            '&phi;'=>'^phi^', 
            '&pi;'=>'^pi^', 
            '&piv;'=>'^piv^', 
            '&prime;'=>'^prime^', 
            '&prod;'=>'^prod^', 
            '&prop;'=>'^prop^', 
            '&psi;'=>'^psi^', 
            '&rArr;'=>'^rArr^', 
            '&radic;'=>'^radic^', 
            '&rang;'=>'^rang^', 
            '&rarr;'=>'^rarr^', 
            '&rceil;'=>'^rceil^', 
            '&rdquo;'=>'^rdquo^', 
            '&real;'=>'^real^', 
            '&rfloor;'=>'^rfloor^', 
            '&rho;'=>'^rho^', 
            '&rlm;'=>'^rlm^', 
            '&rsaquo;'=>'^rsaquo^', 
            '&rsquo;'=>'^rsquo^', 
            '&sbquo;'=>'^sbquo^', 
            '&scaron;'=>'^scaron^', 
            '&sdot;'=>'^sdot^', 
            '&sigma;'=>'^sigma^', 
            '&sigmaf;'=>'^sigmaf^', 
            '&sim;'=>'^sim^', 
            '&spades;'=>'^spades^', 
            '&sub;'=>'^sub^', 
            '&sube;'=>'^sube^', 
            '&sum;'=>'^sum^', 
            '&sup;'=>'^sup^', 
            '&supe;'=>'^supe^', 
            '&tau;'=>'^tau^', 
            '&there4;'=>'^there4^', 
            '&theta;'=>'^thetasym^', 
            '&thetasym;'=>'^thetasym^', 
            '&thinsp;'=>'^thinsp^', 
            '&tilde;'=>'^tilde^', 
            '&trade;'=>'^trade^', 
            '&uArr;'=>'^uArr^', 
            '&uarr;'=>'^uarr^', 
            '&upsih;'=>'^upsih^', 
            '&upsilon;'=>'^upsilon^', 
            '&weierp;'=>'^weierp^', 
            '&xi;'=>'^xi^', 
            '&yuml;'=>'^yuml^', 
            '&zeta;'=>'^zeta^', 
            '&zwj;'=>'^zwj^', 
            '&zwnj;'=>'^zwnj^'); 
    } 
0

Eine alternative Lösung zu arbeiten, ist DomDocument- verwenden> saveHTMLFile() (die keine HTML-Entitäten konvertiert) und den Inhalt der gespeicherten Datei wieder in einen String gelesen .

Es ist nicht sehr schön, aber es hat den Vorteil, dass Sie die Entity-Codes nicht manuell (zweimal) finden und ersetzen müssen, wie bei anderen hier angebotenen Lösungen.