【问题标题】:Stripping microdata from an XHTML with PHP - using RegEx?使用 PHP 从 XHTML 中剥离微数据 - 使用 RegEx?
【发布时间】:2011-06-19 19:41:27
【问题描述】:

首先:我读过一般;不要在像这样的 XHTML 参数上使用 RegEx:RegEx match open tags except XHTML self-contained tags,我明白 RegEx 在嵌套的 XHTML 或 XML 节点上是如何失败的。

我不明白为什么单独操作 XML 的属性会破坏使用 RegEx。因此,一般规则似乎有例外。属性始终包含在以< 开头并以> 结尾的单个节点中,中间的任何其他< or > 都会破坏XML,因此不会发生这种情况。

现在我想清理它可能包含的任何微数据的 XHTML 字符串。即任何属性itemscopeitemtypeitempropitemiditemref。像这样的:

...
<body itemscope="itemscope" itemtype="http://schema.org/WebPage">
<div itemprop="maincontent">content</div>
...

在 PHP 中最好的方法是什么?

【问题讨论】:

  • 如果你想从 HTML 中清除微数据属性,那么 HTMLPurifier 或 htmltidy 可能就足够了。两者都不知道 html5 属性并将其删除。

标签: php regex html xhtml microdata


【解决方案1】:

我实际上建议:

  1. 使用 SimpleXML 之类的内容加载字符串。
  2. 删除您对刷新感兴趣的属性。
  3. 将其保存回字符串。

有一堆命名空间问题我不确定你必须如何处理,但这可能比尝试构建一个或多个正则表达式并确保你不会错过任何东西更干净/更快乐.

编辑:原来 SimpleXML 不起作用(修改能力有限),但 DOM 会。像这样的:

$data=<<<END1
<body itemscope="itemscope" itemtype="http://schema.org/WebPage">
<div itemprop="maincontent">content</div>
</body>
END1;

$xml=new DOMDocument();
$xml->loadXML($data);

// find every relevant node
$xpath = new DOMXPath($xml);
$attr = $xpath->query("//@itemscope|//@itemprop|//@itemtype");
foreach ($attr as $entry) {
  $entry->parentNode->removeAttribute($entry->nodeName);
}
echo $xml->saveXML();

您必须修改它以包含您要删除的所有属性,就像我说的那样,我不知道它将如何处理命名空间,但它是一个开始。

【讨论】:

  • 看起来不错。还有一件事,由于微数据的原因,正文中可能存在元标记。我以为我可以选择那些带有 xpath 'body//meta' 但不知何故它还不起作用......
  • 上面的查询适用于属性:我想你想做//body/meta,但也要意识到,因为这些不是属性,你不能在它们上使用removeAttribute。最简单的方法是将标签放在单独的 xpath 循环中,并改用 removeChild
  • 我理解的。我确实把它做成了一个单独的 xpath 循环并且确实使用了 removeChild。手册上是这样的。 $xml-&gt;getElementsByTagName("body")-&gt;item(0)-&gt;getElementsByTagName("meta")-&gt;length; 会返回标签的实际数量,而我尝试过的所有 xpath 版本甚至 $xpath-&gt;query("//body")-&gt;length 都会返回 0。我想知道我的 xpath 问题是什么。尝试使用 $xpath-&gt;query("//@itemscope")-&gt;length; 属性进行相同操作...
  • 如果没有代码,很难准确判断你可能做错了什么,但 $blk = $xpath-&gt;query("//meta"); forreach($blk as $t){ $t-&gt;parentNode-&gt;removeChild($t); } 对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多