使用 PHP 从 XHTML 中剥离微数据 - 使用 RegEx?

发布于 2024-11-15 22:59:11 字数 743 浏览 3 评论 0原文

第一:我读过一般内容;不要在 XHTML 参数上使用 RegEx,如下所示:RegEx 匹配除了 XHTML 自包含标签之外的开放标签,并且我确实了解 RegEx 如何在嵌套 XHTML 或 XML 节点上失败。

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

现在我想清除 XHTML 字符串中可能包含的任何微数据。这是任何属性 itemscopeitemtypeitempropitemiditemref。像这样的事情:

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

在 PHP 中执行此操作的最佳方法是什么?

First: I've read the general; don't use RegEx on XHTML arguments like this one: RegEx match open tags except XHTML self-contained tags and I do understand how RegEx will fail on nested XHTML or XML nodes.

I don't see why manipulating attributes of an XML alone should break using RegEx. So there seems to be exceptions to the general rule. Attributes are always contained in a single node starting with a < and ending with a > any other < or > in between would break the XML so such can't occur.

Now I'd like to clean an XHTML string of any microdata it might contain. That is any attributes itemscope, itemtype, itemprop, itemid and itemref. Something like this:

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

What's the best way to do this in PHP?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

惯饮孤独 2024-11-22 22:59:11

我实际上建议:

  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();

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

I'd actually suggest:

  1. Loading the string with something like SimpleXML.
  2. Removing the attributes you are interested in flushing.
  3. Saving it back to a string.

There are a bunch of namespace issues that I'm not sure how you'd have to handle, but that will probably be cleaner/happier than trying to build one or more regex expressions and make sure you don't miss anything.

EDIT: turns out SimpleXML won't work (limited modification capabilities) but DOM will. Something like this:

$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();

You'd have to modify it to include all the attributes you want to remove, and like I said I have no clue how it would deal with namespaces, but its a start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文