Php 如何将HTML转换为XHTML

Php 如何将HTML转换为XHTML,php,html,xhtml,Php,Html,Xhtml,可能重复: PHP中是否有现成的函数来实现这一点?基本上,我从Smarty模板中获取HTML数据,并希望通过编码将其转换为XHTML $filename = 'template.php'; // filepath to file // All options : http://tidy.sourceforge.net/docs/quickref.html $options = array('output-xhtml' => true, 'clean' => true, 'wrap

可能重复:

PHP中是否有现成的函数来实现这一点?基本上,我从Smarty模板中获取HTML数据,并希望通过编码将其转换为XHTML

$filename = 'template.php'; // filepath to file

// All options : http://tidy.sourceforge.net/docs/quickref.html
$options = array('output-xhtml' => true, 'clean' => true, 'wrap-php' => true);

$tidy = new tidy(); // create new instance of Tidy
$tidy->parseFile($filename, $options); // open file
$tidy->cleanRepair(); // process with specified options

copy($filename, $filename . '.bak'); // backup current file

file_put_contents($filename, $tidy); // overwrite current file with XHTML version

我没有一个Smarty模板文件来测试它,但请尝试一下,看看它在转换一个模板时是否正常工作。在运行这种性质的东西时,请一如既往地备份您的文件。首先测试示例文件。

问题是您没有html文件可供使用。您有一个用编程语言smarty编写的php模板,它不是标记,即使它包含标记块。你在找一根魔杖,但没有这样的魔杖

如果它是纯html,那么您可能可以使用Domdocument将文件读入Dom结构并生成xhtml,但这对于纯源文件来说根本不起作用,尽管您可以编写解析器来读取smarty tpl文件,查找html片段并尝试将其加载到Domdocument对象中


话虽如此,我首先要问一个问题——既然xhtml基本上是一个失败的标准,现在已经过时了,为什么你真的要转换成xhtml呢?其次,如果你有正当的理由想继续前进,为什么不能使用一些正则表达式搜索和替换更改doctype的代码段,以及一些基于正则表达式的搜索来查找缺少end标记的标记,以及需要的其他相对较小的调整。html和xhtml之间的区别可以归结为一些非常容易理解的规则。

回答您最初的问题:某种程度上。核心PHP->DOM、SimpleXML、SPL=模板引擎。这就是Smarty等模板引擎存在的原因和方式

回复:按照评论中的建议安装Tidy

Tidy有一个先决条件库。如果您还没有:

要使用Tidy,您需要安装libtidy,可在Tidy主页上找到

要启用,您需要重新编译PHP并将其包含在配置标志中:

php -i | grep config
此扩展与PHP5及更高版本捆绑在一起,并已安装 使用-with-tidy配置选项

因此,获取现有的配置标志:

php -i | grep config
再加上整洁

然而,这可能是错误的方法。它不能解决输出XHTML而不是HTML的实际问题——它解决了Smarty的问题。重新编译PHP以添加一个扩展,这样您就可以使用它来修复模板引擎的DOCTYPE缺陷,这可能意味着如果可能的话,您应该考虑使用不同的模板引擎。这是一种极端的做法,并为您得到的东西增加了很多开销,这相当于一种黑客式的非解决方案绷带解决方案,可以追溯性地修复损坏的输出

PEAR的HTML_Template_PHPTAL可能是解决您的问题的最佳解决方案,也是与原始问题最接近的答案。 如果PHPTAL没有完全削减它,至少有5个其他可用的梨库可供选择

或者它已经被移植到Git:

git clone git://github.com/pornel/PHPTAL
粗略的谷歌搜索:


HTH

你看过这个吗?我看了看。但是找不到安装和使用那篇文章中的PHP Tidy扩展的方法。它是一个捆绑的扩展,因此可以使用PHP编译if。要检查,只需执行此操作:$tidy=new tidy;如果该类不存在,则默认情况下不安装该类。如果是这种情况,您可以检查您的php.ini文件,如果您有权加载扩展名。只是澄清一下-您是否试图通过某种转换例程运行smarty模板,该例程将解析html部分并将其转换为xhtml?谢谢您的建议@cryptic。当我创建tidy class对象时,屏幕显示ablank,没有错误消息。这是否意味着tidy工作时没有任何错误?感谢您的回答,但是有没有其他方法可以在不使用tidy HTML的情况下实现这一点?tidy是一个扩展。默认情况下,它与PHP5捆绑在一起,但它需要一个外部libtidy,默认情况下不启用。启用它意味着使用-with-tidy-config选项重新编译php。这几乎不是内置的。