我试图找到一种方法来可靠地找到并替换不属于标签的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<C
,Blue<Red<Green
,Test < Test2
....真的是什么
This is a test where 6 <charref fontname=Helvetica encoding=unicode><<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><<resetfont>99999\n
我已经尝试了str_replace
和preg_replace
,但无法找到可靠地保留标记并在上下文中仅替换<
的解决方案。
解析DOM似乎也失败了,因为DOMDocument
也将<
视为开头标记
在字符串上使用htmlspecialchars
会将所有标记<>
转换为<>
,这也不错。
有没有人有任何想法?
答案 0 :(得分:1)
尝试通过char读取字符串,如果它遇到&lt;如果&gt;将其推入缓冲区如果它遇到一个&lt;再次标记前一个&lt;然后将其放入缓冲区...并重复直到字符串结尾
答案 1 :(得分:1)
尝试使用此问题的答案:
我尝试按原样添加它,但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提取你想要的位。
请注意,即使原始数据不包含此文档,也会生成包含head
和body
等的完整HTML文档。
如果您只想解析HTML片段,可以执行以下操作:
$dom = HTML5_Parser::parseFragment($input);
将返回DOMNodeList。
答案 3 :(得分:0)
HTML实体是执行此类操作的最佳方式<>
是用于替换HTML中的<>
的实体。甚至使用<code>
标签。您可以使用这些实体,并将其替换为HTML标记中的<>
。 www.w3schools.com/html/html_entities.asp