我有一些返回的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 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/".这可能吗?
一如既往地感谢您的帮助!
我正在遵循这个问题的建议: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) 这是我的代码:
$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>èà éìòù</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并在标记内进行一些替换.
我正在尝试使用DOMDocument解析HTML代码,对其进行更改,然后将其组合回我发送到输出的字符串.
但是有一些关于解析的问题,这意味着我发送给DOMDocument的内容并不总是以相同的形式返回:)
这是一个清单:
使用- > loadHTML:
preserveWhitespace和formatOutput设置如何(在预先格式化的文本上丢失空白)<header>,<footer>等,但它们可以supressed,这样我就可以用这个活.<link ... />元素(带有自闭标记),解析/ saveHTML后输出将是<link .. >使用- > loadXML:
>来自<style>或<script>标签的实体:body > div变成body > 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) 为什么不能var_dump使用DomDocument对象,同时print($dom->saveHTML())产生输出?
我正在尝试在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来解析和规范化用户提交的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片段将被插入到现有的有效文档中.
将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).任何建议赞赏.
domdocument ×10
php ×9
dom ×2
html ×2
attributes ×1
execcommand ×1
html5 ×1
javascript ×1
loops ×1
parsing ×1
regex ×1
tags ×1
utf-8 ×1
xml ×1