Intereting Posts
копирование на временную таблицу занимает много времени Рекурсивный mod_rewrite для дружественных поисковых запросов PHP Получить протокол URL сайта – http vs https strtotime () & date () странное поведение при преобразовании даты в тот же формат, что и раньше Null против False против 0 в PHP Есть ли способ получить название категории в нижнем регистре? Как исправить ассоциативные ключи массива, которые не имеют одинарных кавычек в нескольких файлах Как отсортировать XML-канал с помощью SimpleXML PHP session_start (); не работает, когда инициируется в верхней части страницы Используя $ this внутри статических методов и методов, вызываемых этим методом Модуль не может быть инициализирован zf3 уже искали Интернет Самый эффективный способ изменить хэш-тип пароля (md5-sha1) OAuth, PHP, Rest API и curl дают 400 Bad Request Что означает недопустимый код результата 70007? Как это исправить? Запрос Xpath с PHP (возьмите два значения)

Есть ли способ сохранить целостность объектов при анализе html с помощью DomDocument?

У меня есть эта функция, чтобы каждый тег 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; } 

Он отлично работает, но возвращает декодированные объекты как символы Unicode

 $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 & Mr&nbsp;Hyde</center> EOHTML; echo absoluteSrc($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 & Mr&nbsp;Hyde</center> EOHTML; echo absoluteSrc($html); 

Выходы:

 <p><img src="http://img.ruphp.com/domdocument/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://img.ruphp.com/domdocument/ipsum.png" alt="ipsum" align="right"></p> <center>© Dr Jekyll &amp; Mr Hyde</center> 

Как вы можете видеть в последней строке

  • & копировать; переводится в © (U + 00A9),
  • & NBSP; к неразрывному пространству (U + 00A0),
  • & # 38; к & amp;

Я бы хотел, чтобы они оставались такими же, как и в строке ввода.

Solutions Collecting From Web of "Есть ли способ сохранить целостность объектов при анализе html с помощью DomDocument?"

Я тоже хотел бы знать ответ на этот вопрос.

Я закончил конвертировать & …; сущности до **ENTITY-...-ENTITY** перед разбором и преобразованием назад после его завершения.

Следующий код, похоже, работает

  $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^'); } к  $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^'); } 

Альтернативным решением является использование DOMDocument-> saveHTMLFile () (который не конвертирует объекты HTML) и считывает содержимое сохраненного файла обратно в строку.

Это не супер красиво, но имеет то преимущество, что вам не нужно вручную находить и заменять коды объектов самостоятельно (дважды) в соответствии с некоторыми другими предлагаемыми здесь решениями.