Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DOM操作_Php_Regex_Wordpress_Dom_Preg Replace - Fatal编程技术网

Php DOM操作

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

我试图在PHP中使用DOM来完成一项非常具体的工作,但到目前为止我没有得到任何运气,目标是从Wordpress的博客文章(从DB,这是一个Wordpress插件)中获取一个HTML字符串。然后在HTML中,用
新内容替换
旧内容“
”。在其结构中保存高于或低于该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文档,我不知道如何解决这个问题。。。