2010-09-16 20 views
6

मैं हर img टैग सुनिश्चित करने के लिए इस समारोह है निरपेक्ष URL है:क्या डोम डॉक्यूमेंट के साथ एचटीएमएल पार्स करते समय इकाइयों को बरकरार रखने का कोई तरीका है?

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; 
} 

यह ठीक काम करता है, लेकिन यह यूनिकोड वर्ण

$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); 

आउटपुट के रूप में डीकोड संस्थाओं रिटर्न:

<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> 

जैसा कि आप अंतिम पंक्ति में देख सकते हैं

  • & प्रतिलिपि; का अनुवाद (यू +00 ए 9),
  • & nbsp; गैर-ब्रेकिंग स्पेस (यू +00 ए0),
  • & # 38; से & amp;

मैं उन्हें इनपुट स्ट्रिंग के समान ही रखना चाहता हूं।

+0

मैं भी इसका उत्तर जानना चाहता हूं। मैंने &..; इकाइयों को ** ईएनटीटीआई -..- ईएनटीटीआई ** में परिवर्तित करने से पहले इसे पार करने और परिवर्तित करने से पहले परिवर्तित कर दिया। –

+1

मैंने इसे केवल amp 'str_replace (' & ','^amp^', $ html)', 'str_replace ('^amp^',' & ', $ html) को बदलने के लिए सरलीकृत किया है और यह काम करता है, धन्यवाद! कृपया इसे उत्तर के रूप में पोस्ट करें ताकि इसे स्वीकार किया जा सके यदि कोई अन्य गैर-क्लेजगी तरीका –

+0

शायद यह अपराधी है: http://nl2.php.net/manual/en/class.domdocument.php#domdocument.props .substituteentities (एक पल में परीक्षण करेंगे ...) – Wrikken

उत्तर

0

मैं भी इसका उत्तर जानना चाहता हूं।

मैं & कनवर्ट करना समाप्त कर दिया ..; पार्सिंग और इसे पूरा करने के बाद वापस परिवर्तित करने से पहले **ENTITY-...-ENTITY** पर इकाइयां।

1

निम्नलिखित कोड काम करने के लिए

$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

एक वैकल्पिक समाधान DOMDocument-> saveHTMLFile() (जो HTML निकाय परिवर्तित नहीं करता है) का उपयोग करें और एक स्ट्रिंग में सहेजी गई फ़ाइल वापस की सामग्री पढ़ने की है लगता है ।

यह बहुत सुंदर नहीं है, लेकिन इसका लाभ यहां दिए गए कुछ अन्य समाधानों के अनुसार इकाई कोड को मैन्युअल रूप से ढूंढने और प्रतिस्थापित करने का लाभ नहीं है (दो बार)।