PHP正则表达式从帖子内容中剥离所有表单元素及其内容

pes8fvy9  于 2023-01-29  发布在  PHP
关注(0)|答案(1)|浏览(117)

我有一个插件可以在更新帖子之前修改帖子内容。问题是它与另一个插件冲突,后者为每个帖子在表单前添加一个按钮。因此,当插件运行时,它无意中更新了帖子内容,将表单标签包含在数据库中的帖子内容中,除非我在更新运行之前做一些事情来剥离表单及其内容。
为了阻止这种情况,我想在更新帖子之前从内容中剥离任何表单元素及其内容。

$contentupdate = $content;
$contentupdate = preg_replace('<\s*form[^>]*>(.*?)<\s*/\s*form>', '', $contentupdate);
$posttoupdate = array(
    'ID' => $postid,//the ID of the Post
    'post_content' => $contentupdate,
);
wp_update_post($posttoupdate);

不幸的是,这会从内容中剥离所有内容。它会完全剥离表单、表单标签之间的内容以及其他所有内容,但仅限于页面刷新时。页面第一次加载时,看起来还不错,但再次加载时,所有帖子内容都消失了。这是绑定到_content的过滤器调用的函数的一部分。
根据Regex测试人员的说法,上面的正则表达式应该可以正常工作。

vlju58qv

vlju58qv1#

您可以尝试使用DOMDocument()类。

$dom = new DOMDocument();
$dom->loadHTML($content);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//form') as $node) {
    $node->parentNode->removeChild($node);
}

$contentupdate = $dom->saveHTML();
$posttoupdate = array(
    'ID'           => $postid,
    'post_content' => $contentupdate,
);

wp_update_post($posttoupdate);

这将搜索HTML中的所有表单元素。
希望这个有用。

相关问题