标签: domdocument

使用preg_replace转换缩进(无回调)

我有一些返回的XML块DOMDocument::saveXML().它已经非常缩进,每个级别有两个空格,如下所示:

<?xml version="1.0"?>
<root>
  <error>
    <a>eee</a>
    <b>sd</b>
  </error>
</root>
Run Code Online (Sandbox Code Playgroud)

由于无法配置DOMDocument(AFAIK)缩进字符,我认为可以运行正则表达式并通过将所有两个空格对替换为制表符来更改缩进.这可以通过回调函数(Demo)来完成:

$xml_string = $doc->saveXML();
function callback($m)
{
    $spaces = strlen($m[0]);
    $tabs = $spaces / 2;
    return str_repeat("\t", $tabs);
}
$xml_string = preg_replace_callback('/^(?:[ ]{2})+/um', 'callback', $xml_string);
Run Code Online (Sandbox Code Playgroud)

我现在想知道是否有可能做这个没有回调函数(并且没有e-modifier(EVAL)).有想法的任何正则表达式向导?

php regex xml domdocument

22
推荐指数
2
解决办法
1760
查看次数

使用PHP DOMDocument更改标记属性值

我想用PHP DOMDocument更改标记属性的值.

例如,假设我们有这行HTML:

<a href="http://foo.bar/">Click here</a>
Run Code Online (Sandbox Code Playgroud)

我在PHP中加载上面的代码如下:

$dom = new domDocument;
$dom->loadHTML('<a href="http://foo.bar/">Click here</a>');
Run Code Online (Sandbox Code Playgroud)

我想使用PHP的DOMDocument扩展名将"href"值更改为"http://google.com/".这可能吗?

一如既往地感谢您的帮助!

php tags attributes dom domdocument

22
推荐指数
2
解决办法
2万
查看次数

不能使用`document.execCommand('copy');`来自开发者控制台

调用document.execCommand('copy'); false每次都会从Chrome开发者控制台返回.

亲自尝试一下.打开控制台并运行它,它永远不会成功.

知道为什么?

在此输入图像描述

javascript google-chrome domdocument execcommand

22
推荐指数
2
解决办法
3万
查看次数

循环遍历DOMDocument

我正在遵循这个问题的建议:Robust,PHP的成熟HTML解析器,关于解析可能与DOMDocument格式错误的HTML .

是否有任何简单的方法来循环解析文档?所以我想像这样循环html.

$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);
???
foreach (??? as $node)
{
  print $node->nodeName.':'.$node->nodeValue;
}
Run Code Online (Sandbox Code Playgroud)

得到的结果有点像这样.

 ul:
 li:value1
 li:value2
 li:value3
 p:subvalue
 p:hello world
Run Code Online (Sandbox Code Playgroud)

单独使用$doc->childNodes并不能真正做到我想要的.因为它似乎没有下到树中的较低分支.我使用halfdan建议的代码,我得到这样的结果.

html:
html:value1
         value1
         value3
            subvalue

        hello world
Run Code Online (Sandbox Code Playgroud)

php loops domdocument

21
推荐指数
1
解决办法
2万
查看次数

DomDocument和特殊字符

这是我的代码:

$oDom = new DOMDocument();
$oDom->loadHTML("èàéìòù");
echo $oDom->saveHTML();
Run Code Online (Sandbox Code Playgroud)

这是输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>&Atilde;&uml;&Atilde;&nbsp;&Atilde;&copy;&Atilde;&not;&Atilde;&sup2;&Atilde;&sup1;</p></body></html>
Run Code Online (Sandbox Code Playgroud)

我想要这个输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>èàéìòù</p></body></html>
Run Code Online (Sandbox Code Playgroud)

我试过......

$oDom = new DomDocument('4.0', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

或1.0和其他东西,但没有.

另一件事......有一种方法可以获得相同的未触动的HTML?例如,输入中的html 使用DOMDocument <p>hello!</p>获取相同的输出,<p>hello!</p>仅用于解析DOM并在标记内进行一些替换.

php utf-8 domdocument

21
推荐指数
5
解决办法
1万
查看次数

如何使HTML5与DOMDocument一起使用?

我正在尝试使用DOMDocument解析HTML代码,对其进行更改,然后将其组合回我发送到输出的字符串.

但是有一些关于解析的问题,这意味着我发送给DOMDocument的内容并不总是以相同的形式返回:)

这是一个清单:

  1. 使用- > loadHTML:

    • 格式化我的文档,无论preserveWhitespaceformatOutput设置如何(在预先格式化的文本上丢失空白)
    • 给我的错误,当我有HTML5标签,如<header>,<footer>等,但它们可以supressed,这样我就可以用这个活.
    • 产生不一致的标记 - 例如,如果我添加一个<link ... />元素(带有自闭标记),解析/ saveHTML后输出将是<link .. >
  2. 使用- > loadXML:

    • 编码>来自<style><script>标签的实体:body > div变成body &gt; div
    • 所有标签都以相同的方式关闭,例如<meta ... />变为<meta...></meta>; 但这可以用正则表达式修复.

我没有尝试HTML5lib,但出于性能原因,我更喜欢DOMDocument而不是自定义解析器


更新:

就像使用CDATA提到的Honeymonster一样,修复了loadXML的主要问题.

有没有什么方法可以防止除了某个集合之外的所有空HTML标签的自动关闭,而不使用正则表达式?

现在我有:

$html = $dom->saveXML($node);

$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){

       // ignore only these tags
       $xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', …
Run Code Online (Sandbox Code Playgroud)

php html5 domdocument

19
推荐指数
4
解决办法
1万
查看次数

18
推荐指数
2
解决办法
5499
查看次数

在PHP中调试DOMDocument对象

我正在尝试在php中调试一个大而复杂的DOMDocument对象.理想情况下,如果我能让DOMDocument以类似数组的格式输出,那就太好了.

DOM文档:

$dom = new DOMDocument();
$dom->loadHTML("<html><body><p>Hello World</p></body></html>");
var_dump($dom); //or something equivalent

这输出

DOMDocument Object ( ) 

而我希望它输出

DOMDocument:
html
=>body
==>p
===>Hello World

或类似的东西.为什么没有方便的调试或输出?!?

php domdocument

17
推荐指数
4
解决办法
1万
查看次数

PHP DOMDocument - 获取BODY的html源代码

我正在使用PHP的DOMDocument来解析和规范化用户提交的HTML,使用该loadHTML方法解析内容,然后通过以下方式获得格式良好的结果saveHTML:

$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');
$well_formed= $dom->saveHTML(); 
echo($well_formed);
Run Code Online (Sandbox Code Playgroud)

这可以很好地解析片段并添加适当的结束标记.问题是,我也越来越一堆标签,我不想如<!DOCTYPE>,<html>,<head><body>.我知道每个格式良好的HTML文档都需要这些标记,但我正在规范化的HTML片段将被插入到现有的有效文档中.

html php parsing dom domdocument

17
推荐指数
2
解决办法
2万
查看次数

对html片段的loadHTML LIBXML_HTML_NOIMPLIED会生成错误的标记

将LIBXML_HTML_NOIMPLIED标志与html片段一起使用会生成错误的标记:

$str = '<p>Lorem ipsum dolor sit amet.</p><p>Nunc vel vehicula ante.</p>';
$doc = new DOMDocument();
$doc->loadHTML($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
echo $doc->saveHTML();
Run Code Online (Sandbox Code Playgroud)

输出:

<p>Lorem ipsum dolor sit amet.<p>Nunc vel vehicula ante.</p></p>
Run Code Online (Sandbox Code Playgroud)

我发现使用正则表达式可以解决这个问题,但这会破坏使用DOM的目的.我用几个版本的libxml和php测试了这个,最新的libxml 2.9.2,php 5.6.7(Debian Jessy).任何建议赞赏.

html php domdocument

17
推荐指数
2
解决办法
5959
查看次数

标签 统计

domdocument ×10

php ×9

dom ×2

html ×2

attributes ×1

execcommand ×1

google-chrome ×1

html5 ×1

javascript ×1

loops ×1

parsing ×1

regex ×1

tags ×1

utf-8 ×1

xml ×1