Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保PHP中字符串的XHTML有效_Php_Xml Parsing_Html Entities_Htmlspecialchars - Fatal编程技术网

确保PHP中字符串的XHTML有效

确保PHP中字符串的XHTML有效,php,xml-parsing,html-entities,htmlspecialchars,Php,Xml Parsing,Html Entities,Htmlspecialchars,我使用XHTML过渡doctype在浏览器中显示内容。但是,在输出到浏览器之前,内容会显示出来,并通过XML解析器(DOMDocument)进行最后润色 我为我的网站使用定制设计的CMS,允许我对网站进行更改。我有一个模块,允许我以类似WordPress小部件的方式在我的网站上显示HTML脚本 我现在面临的问题是,我需要确保通过该模块提供的任何代码都应该是有效的XHTML格式,否则该模块将需要将代码转换为有效的XHTML。当前,如果输入代码的一部分不符合XHTML,那么我的XML解析器将中断并抛

我使用XHTML过渡doctype在浏览器中显示内容。但是,在输出到浏览器之前,内容会显示出来,并通过XML解析器(DOMDocument)进行最后润色

我为我的网站使用定制设计的CMS,允许我对网站进行更改。我有一个模块,允许我以类似WordPress小部件的方式在我的网站上显示HTML脚本

我现在面临的问题是,我需要确保通过该模块提供的任何代码都应该是有效的XHTML格式,否则该模块将需要将代码转换为有效的XHTML。当前,如果输入代码的一部分不符合XHTML,那么我的XML解析器将中断并抛出警告

我正在寻找的是一个解决方案,它对URL中存在的实体和通过TextArea控件提供的输入的文本部分进行编码。例如,以下字符串将中断给定实体引用错误的解析器:

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

此外,以下行也会导致相同的错误:

<a href="http://www.somesite.com">Books & Cool stuff<a/>
书籍&很酷的东西
另外,如果我使用
htmlspecialchars
htmlspecialchars
,它们也会转换标签的尖括号,这是不需要的。我只需要对URL和字符串的文本部分进行转义/编码

任何帮助都将不胜感激

感谢和问候,
Waqar Mushtaq是一个计算机程序和一个库,其目的是修复无效的HTML并改进生成的标记的布局和缩进样式

它能够修复的错误HTML示例:

  • 缺少或不匹配的结束标记、混淆的标记
  • 添加缺少的项目(一些标记、引号等)
  • 报告专有HTML扩展
  • 将标记的布局更改为预定义样式
  • 将某些编码中的字符转换为HTML实体

首先需要生成有效的XHTML。你所有的属性都很重要

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

应该是

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>
<a href="http://www.somesite.com">Books &amp; Cool stuff</a>


应该是

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>
<a href="http://www.somesite.com">Books &amp; Cool stuff</a>


始终生成有效的XHTML并不容易。如果可能的话,我建议您寻找其他方式进行后期处理。

正如快速评论中所建议的,您可以用非常舒适的方式解决问题

要将HTML片段(即使是好的标记汤)转换为
DomDocument
SimpleXML
可以处理的内容,可以使用以下方法:

$config = array(
    'output-xhtml' => 1,
    'show-body-only' => 1
);
$fragment = tidy_repair_string($html, $config);
$xhtml = sprintf("<body>%s</body>", $fragment);

示例:使用DomDocument加载HTML

使用first对其进行规范化。解决XML逃避困境的正确方法是——但这是相当不标准的。因此,要保持输出XHTML语法的一致性(即使您实际上使用了错误的MIME类型发送它),实际上就是通过libtidy进行传输。tidy性能有效吗?感谢分享这一点,但是,在粘贴到textarea控件之前修改每个代码段是不可行的。我希望我的后端能够处理它。那么你就不能这样做,否则会出现输出格式错误的情况。谢谢你的帮助。还有一个问题。是使用Tyy先解析文本然后再加载到XML解析器中的开销吗?@ Waqar Mushtaq:如果它实际上允许您的系统按预期运行,我不会考虑开销而是必要的。如果
$dom->loadHTML($fragment),您可以尝试已经完成了这项工作。