Php DOM操作
我试图在PHP中使用DOM来完成一项非常具体的工作,但到目前为止我没有得到任何运气,目标是从Wordpress的博客文章(从DB,这是一个Wordpress插件)中获取一个HTML字符串。然后在HTML中,用Php DOM操作,php,regex,wordpress,dom,preg-replace,Php,Regex,Wordpress,Dom,Preg Replace,我试图在PHP中使用DOM来完成一项非常具体的工作,但到目前为止我没有得到任何运气,目标是从Wordpress的博客文章(从DB,这是一个Wordpress插件)中获取一个HTML字符串。然后在HTML中,用新内容替换旧内容“”。在其结构中保存高于或低于该div的任何内容 然后将HTML保存回数据库,应该很简单,我读到正则表达式不是正确的方法,所以我转而使用DOM 问题是我只是无法让它工作,无法提取div或其他任何东西 救救我 更新 wordpress表中显示的HTML如下所示: Congrat
新内容替换旧内容“
”。在其结构中保存高于或低于该div的任何内容
然后将HTML保存回数据库,应该很简单,我读到正则表达式不是正确的方法,所以我转而使用DOM
问题是我只是无法让它工作,无法提取div或其他任何东西
救救我
更新
wordpress表中显示的HTML如下所示:
Congratulations on finding us here on the world wide web, we are on a mission to create a website that will show off your culinary skills better than any other website does.
<div id="do_not_edit">blah blah</div>
We want this website to be fun and easy to use, we strive for simple elegance and incredible functionality.We aim to provide a 'complete package'. By this we want to create a website where people can meet, share ideas and help each other out.
您的HTML不是一个完整的HTML文档,这正是DOMDocument所期望的。一种选择是包装HTML,使其成为完整的文档:
$content = ($wpdb->get_var( "SELECT `post_content` FROM $wpdb->posts WHERE ID = {$article[post_id]}" ));
$content = '<html><head><title></title></head><body>'.$content.'</body></html>';
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$element = $doc->getElementById('do_not_edit');
echo $element;
$content=($wpdb->get_var(“从$wpdb->posts WHERE ID={$article[post_ID]}中选择`post_content`”);
$content='.$content'.';
$doc=新的DOMDocument();
$doc->validateOnParse=false;
$doc->loadHTML($content);
$element=$doc->getElementById('do_not_edit');
echo$元素;
它有点粗糙,但可能很容易解决问题。您的HTML不是一个完整的HTML文档,这正是DOMDocument所期望的。一种选择是包装HTML,使其成为完整的文档:
$content = ($wpdb->get_var( "SELECT `post_content` FROM $wpdb->posts WHERE ID = {$article[post_id]}" ));
$content = '<html><head><title></title></head><body>'.$content.'</body></html>';
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$element = $doc->getElementById('do_not_edit');
echo $element;
$content=($wpdb->get_var(“从$wpdb->posts WHERE ID={$article[post_ID]}中选择`post_content`”);
$content='.$content'.';
$doc=新的DOMDocument();
$doc->validateOnParse=false;
$doc->loadHTML($content);
$element=$doc->getElementById('do_not_edit');
echo$元素;
这有点粗糙,但可能很容易解决问题。如果您确定WordPress中的HTML只包含一个div,那么以下内容应该可以工作:
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');
echo $divs->item(0)->textContent;
如果没有,请尝试:
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');
for($i=0; $i<$divs->length; $i++)
{
$id = $divs->item($i)->attributes->getNamedItem('id');
if($id && $id->value == 'do_not_edit')
{
//your code here...
$node = $divs->item($i);
$newText = new DOMText("This is some new content");
$node->appendChild($newText);
$node->removeChild($node->firstChild);
break;
}
}
$html = $doc->saveHTML();
$doc=newDOMDocument();
$doc->validateOnParse=false;
$doc->loadHTML($content);
$divs=$doc->getElementsByTagName('div');
对于($i=0;$i长度;$i++)
{
$id=$divs->item($i)->attributes->getNamedItem('id');
如果($id&&$id->value=='do\u not\u edit')
{
//你的代码在这里。。。
$node=$divs->item($i);
$newText=newdomtext(“这是一些新内容”);
$node->appendChild($newText);
$node->removeChild($node->firstChild);
打破
}
}
$html=$doc->saveHTML();
如果您确定WordPress中的HTML只包含一个div,则以下操作应该有效:
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');
echo $divs->item(0)->textContent;
如果没有,请尝试:
$doc = new DOMDocument();
$doc->validateOnParse = false;
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');
for($i=0; $i<$divs->length; $i++)
{
$id = $divs->item($i)->attributes->getNamedItem('id');
if($id && $id->value == 'do_not_edit')
{
//your code here...
$node = $divs->item($i);
$newText = new DOMText("This is some new content");
$node->appendChild($newText);
$node->removeChild($node->firstChild);
break;
}
}
$html = $doc->saveHTML();
$doc=newDOMDocument();
$doc->validateOnParse=false;
$doc->loadHTML($content);
$divs=$doc->getElementsByTagName('div');
对于($i=0;$i长度;$i++)
{
$id=$divs->item($i)->attributes->getNamedItem('id');
如果($id&&$id->value=='do\u not\u edit')
{
//你的代码在这里。。。
$node=$divs->item($i);
$newText=newdomtext(“这是一些新内容”);
$node->appendChild($newText);
$node->removeChild($node->firstChild);
打破
}
}
$html=$doc->saveHTML();
看起来您的HTML无效(引号),因此解析器将失败。很抱歉,这只是我这里的一个输入错误。我们需要的信息不仅仅是“无法使其工作”。错误消息、输出和/或代码将帮助我们帮助您。当您更换echo$元素时,您看到的输出是什么代码>带有变量转储($element)代码>?我得到了一个很好且简单的-null看起来您的HTML无效(引号),因此解析器将失败。很抱歉,这只是我这里的一个输入错误。我们需要的信息不仅仅是“无法使其工作”。错误消息、输出和/或代码将帮助我们帮助您。当您更换echo$元素时,您看到的输出是什么代码>带有变量转储($element)代码>?我得到了一个漂亮而简单的-NULL对象。我仍然得到了一个NULL对象。请参阅我的编辑:您想要的是loadHTML(),而不是loadHTMLFile()。另外,我建议不要验证。仍然为空,我尝试了验证true和false,尝试了HTML和HTMLfile,无法理解为什么它无法获取一个具有唯一属性的简单divid@bluedaniel:您必须提供完整的,有效的HTML文件,包括一个DTD,该DTD定义了一个类型为ID的属性,以便getElementById
工作。是的,我读过该文件,但无法确定DTD是什么,或者如何编码。我仍然只得到一个空对象。请参阅我的编辑:您想要loadHTML(),而不是loadHTMLFile()。另外,我建议不要验证。仍然为空,我尝试了验证true和false,尝试了HTML和HTMLfile,无法理解为什么它无法获取一个具有唯一属性的简单divid@bluedaniel:您必须提供完整的,有效的HTML文件,包括一个DTD,该DTD定义了一个ID类型的属性,以便getElementById
工作。是的,我读过,但不知道DTD是什么,或者如何编码,无法确认它是唯一的div。你的第二个答案仍然会选择文本中的第一个div,if($ID&$ID->value='do\u not edit')代码>没有被正确调用。@bluedaniel:对不起,愚蠢的错误:杀死
after:if($id&&$id->value='do\u not\u edit')
josh谢谢,但现在我要解决第二个问题,我如何替换内容?@bluedaniel:使用$doc->saveHTML()查看我编辑过的答案。唯一的问题是,这会将您的代码转换为完整的HTML文档,我不知道如何解决这个问题…无法确认它是唯一的div。您的第二个答案仍然会选择文本中的第一个div,if($id&&$id->value=='do_not_edit')代码>没有被正确调用。@bluedaniel:对不起,愚蠢的错误:杀死
after:if($id&&$id->value='do\u not\u edit')
josh谢谢,但现在我要解决第二个问题,我如何替换内容?@bluedaniel:使用$doc->saveHTML()查看我编辑过的答案。唯一的问题是,这会将您的代码转换为完整的HTML文档,我不知道如何解决这个问题。。。