PHP 返回 XML 字符串,其中的值添加到属性缺少值

PHP return XML string with values added to attributes missing values

提问人:John 提问时间:12/21/2020 更新时间:12/21/2020 访问量:91

问:

我必须从电子邮件中解析 HTML 和“HTML”。我已经设法创建了一个函数,可以清除大多数错误,例如元素嵌套不当。

我正在尝试确定如何最好地解决缺少值的 HTML 属性的问题。我们最终必须将所有内容解析为 XML,因此格式良好的 HTML 也是必须的。

清洁功能开始很简单:

$xml = explode('<', $xml);

我们快速确定元素的开始和结束标签。

然而,一旦我们进入属性,事情很快就会变得非常混乱:

  • 缺少值。
  • 人们使用单引号而不是双引号。
  • 属性值可以包含单引号。

下面是我们必须解析的 HTML 字符串(元素)的示例:p

$s = 'p obnoxious nonprofessional style=\'wrong: lulz-immature\' dunno>Some paragraph text';

我们不在乎这些属性是什么;我们的目标只是修复 XML,使其格式正确,如以下字符串所示:

$s = 'p obnoxious="true" nonprofessional="true" style="wrong: lulz-immature" dunno="true">Some paragraph text';

我们对此不感兴趣,因为这只是额外的工作(大多数电子邮件都是无聊的),所以我们只对每个缺少值的属性附加感兴趣,只是为了防止客户端浏览器上的 XML 解析器故障转移其他人不做他们的工作。attribute="attribute"="true"

正如我之前提到的,我们只需要修复缺少值的属性,并且需要返回一个字符串。至此,格式错误的 XML 的所有其他问题都已得到解决。我不确定我应该从哪里开始,因为这个话题太乱了。所以。。。

  • 我们愿意将整个 XML 字符串作为一个整体发送,以便进行解析,并作为带有一些内置库的字符串返回。如果此选项假定 XML 格式正确,并且具有正确的 XML 声明 ()。<?xml version="1.0" encoding="UTF-8"?>
  • 我们愿意手动创建一个函数来解决我们遇到的任何事情,尽管我们对构建验证器不感兴趣,因为我们在 1997 年收到的“HTML”尖叫声。
  • 我们将 XML 作为单个字符串或数组(您的选择)来处理;我们明确处理文件。

我们如何通过合理的努力确保 XML 字符串(部分或全部)作为字符串返回,其中包含所有属性的值?

php xml xml html 解析

评论

1赞 Jack Fleeting 12/21/2020
如果您不关心属性及其值,为什么不将它们完全删除呢?
0赞 John 12/21/2020
@JackFleeting 由于这可能是一个一劳永逸的实现,将在未来几年或几十年内用于无数封电子邮件,因此我宁愿谨慎行事。但是,至少在精神上我同意你的看法。🤣︀

答:

2赞 Enrico Dias 12/21/2020 #1

DOM 扩展可能会解决您的问题:

$doc = new DOMDocument('1.0');
$doc->loadHTML('<p obnoxious nonprofessional style=\'wrong: lulz-immature\' dunno>Some paragraph text');

echo $doc->saveXML();

上面的代码将产生以下输出:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p obnoxious="" nonprofessional="" style="wrong: lulz-immature" dunno="">Some paragraph text</p></body></html>

如果需要,可以将 every 替换为,但输出已经是有效的 XML。=""="true"

评论

0赞 John 12/21/2020
您的示例有效,我现在正在整个 XML 输出上尝试它......
1赞 John 12/21/2020
我必须花足够的时间来确保它不是死胡同,而且......事实并非如此!接受和 +1 为我节省了至少一周的疯狂;谢谢!