找到< HTML中不属于标记的符号

时间:2013-05-29 15:14:51

标签: php html dom xml-parsing pdflib

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

基本上我从HTML字符串开始并将其转换为PDFLib可用的东西,PDFLib使用XML形式来描述要写成PDF的文档。但是,如果内容中存在<,则会将其视为标记的开头并抛出一个解析异常。

示例输入:

<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<CBlue<Red<GreenTest < 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_replacepreg_replace,但无法找到可靠地保留标记并在上下文中仅替换<的解决方案。

解析DOM似乎也失败了,因为DOMDocument也将<视为开头标记

在字符串上使用htmlspecialchars会将所有标记<>转换为&lt;&gt;,这也不错。

有没有人有任何想法?

4 个答案:

答案 0 :(得分:1)

尝试通过char读取字符串,如果它遇到&lt;如果&gt;将其推入缓冲区如果它遇到一个&lt;再次标记前一个&lt;然后将其放入缓冲区...并重复直到字符串结尾

答案 1 :(得分:1)

尝试使用此问题的答案:

how to repair malformed xml

我尝试按原样添加它,但StackOverflow要求我在答案中添加一些描述,否则它会自动转换为注释,这不能作为答案接受。

答案 2 :(得分:0)

虽然不再维护,但我认为the php port of html5lib可能是解析不良标记的最佳选择。

这样一个简单的电话:

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

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

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

请注意,即使原始数据不包含此文档,也会生成包含headbody等的完整HTML文档。

如果您只想解析HTML片段,可以执行以下操作:

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

将返回DOMNodeList

答案 3 :(得分:0)

HTML实体是执行此类操作的最佳方式&lt;&gt;是用于替换HTML中的<>的实体。甚至使用<code>标签。您可以使用这些实体,并将其替换为HTML标记中的<>www.w3schools.com/html/html_entities.asp