0

我试图找到一种方法来可靠地定位和替换<>属于标签的 HTML/XML 格式字符串中的符号。

基本上,我从一个 HTML 字符串开始,并将其转换为 PDFLib 可用的内容,它使用一种 XML 形式来描述要编写为 PDF 的文档。但是,如果<内容中有一个 inside,它会将其视为标签的开头并引发解析异常。

示例输入:

<p>This is a test where 6 < 9</p>
<p>This is part of <strong>The same test</strong></p>
<p>This should also work 6<99999</p>

周围的文本<并不总是数字,它是用户输入的,可以是任何东西,例如Grade<C, Blue<Red<Green, Test < Test2.... 几乎任何东西

所需输出

This is a test where 6 <charref fontname=Helvetica encoding=unicode>&lt;<resetfont> 9\n
This is part of <fontname=Helvetica fontstyle=bold encoding=unicode>The same test<resetfont>\n
This should also work 6<charref fontname=Helvetica encoding=unicode>&lt;<resetfont>99999\n

我已经尝试过str_replaceand preg_replace,但找不到能够可靠地保留标签并仅替换<上下文的解决方案。

解析 DOM 似乎也失败了,因为它也DOMDocument<视为开始标签

htmlspecialchars在字符串上使用会将所有标签也<>转换&lt;&gt;为不好的。

有没有人有任何想法?

4

4 回答 4

1

尝试使用这个问题的答案:

如何修复格式错误的xml

我试图按原样添加它,但 StackOverflow 要求我在答案中添加一些描述,否则它会自动转换为无法被接受为答案的评论。

于 2013-05-29T16:39:19.633 回答
1

尝试从 start char 读取字符串,如果遇到 < 则将其推入缓冲区 如果 > 没有空格,则它是一个标签,否则如果遇到 < 再次将前一个标记为 < 并将下一个放入缓冲区...并重复直到字符串结束

于 2013-05-29T15:30:46.707 回答
0

HTML 实体是做这些事情的最好方法是在 HTML&lt;&gt;中用于替换的实体<>。即使使用<code>标签。<>您可以在 HTML 标签中使用这些实体并将其替换为。www.w3schools.com/html/html_entities.asp

于 2013-05-29T16:19:02.103 回答
0

虽然不再维护,但我认为html5lib 的 php 端口可能是解析错误标记的最佳选择。

像这样的简单调用:

require_once 'your-path-path-to-html5lib/Parser.php';
$dom = HTML5_Parser::parse($input);

将采用错误的标记$input并返回有效的 php DOMDocument

从那里您可以使用 or 将其保存回字符串,$dom->saveHTML()或者$dom->saveXML使用 DOM API 提取您想要的位。

请注意,即使您的原始数据不包含这些内容,这也会生成包含等head内容的完整 HTML 文档。body

如果你只想解析一个 HTML 片段,你可以这样做:

$dom = HTML5_Parser::parseFragment($input);

这将返回一个DOMNodeList

于 2013-05-29T16:10:36.557 回答