PHP Tidy:打破textareas

时间:2012-04-08 05:08:33

标签: php htmltidy

我有一个带有2个textareas和一个提交按钮的html表单页面(test.php)。我没有复制我想要格式化的源代码并且每次都对它进行硬编码,而是创建了第一个textarea,以便我可以将要清理的代码复制到其中。然后在按下提交按钮后,表单将发布到同一页面并在第二个文本区域中显示整理后的源代码。 显示此简化的源代码是问题。通过HTML整理传递以下代码并尝试在textarea中显示输出,打破输出显示。我的意思是,如果您注意到,我在以下html代码中有</textarea>。一旦Tidy遇到它,它就会关闭textarea并解析源代码的其余信息,就像它是HTML文档的一部分一样,从而破坏了我的整个html表单页面(test.php)。

示例源代码,我通过HTML TIDY:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hi</title>
<link href="css/styles.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="wrapper">

<h1 data-title="Hi"> <a href="<?php echo $_SERVER['PHP_SELF']; ?>"> Hi </a> </h1>  

<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

  <textarea name="comments" id="comments" cols="150" rows="15"><?php echo (isset($_POST['comments']) ? $_POST['comments'] : '' ); ?></textarea>
  <br>
  <input type="submit" name="sbt_process" id="sbt_process" value="Submit">
</form>

<textarea name="css" id="css" cols="150" rows="18"><?php echo (isset($text) ? $text : ''); ?></textarea>

</div><!-- #wrapper -->
</body>
</html>

HTML TIDY PARAMTERS:

$params_body = array(
    'break-before-br'       => 'no',
    'clean'                 => 'clean',
    'doctype'               => 'strict',
    'drop-empty-paras'      => 'yes',
    'drop-font-tags'        => 'yes',
    'force-output'          => 'yes',
    'indent'                => TRUE, //'yes',
    'indent-attributes'     => FALSE,
    'indent-spaces'         => 4,
    'input-encoding'        => 'utf8',
    'join-styles'           => 'yes',
    'literal-attributes'    => 'yes', //This option specifies if Tidy should ensure that whitespace characters within attribute values are passed through unchanged.
    'logical-emphasis'      => 'yes',
    'lower-literals'        => 'yes',
    'merge-divs'            => 'no',
    'merge-spans'           => 'yes',
    'output-encoding'       => 'ascii',
    'output-xhtml'          => 'yes',
    //'output-xml'          => true,
    'output-bom'            => 'no',
    'preserve-entities'     => 'yes',
    'quiet'                 => 'yes',
    'quote-ampersand'       => 'yes',
    'quote-marks'           => 'no',
    'quote-nbsp'            => TRUE, 
    'show-body-only'        => FALSE,
    'show-errors'           => 0,
    'show-warnings'         => 0,
    'sort-attributes'       => 'alpha',
    'vertical-space'        => TRUE, //'yes',
    'wrap'                  => 0, //This option specifies the right margin Tidy uses for line wrapping. Tidy tries to wrap lines so that they do not exceed this length. Set wrap to zero if you want to disable line wrapping.
    'wrap-attributes'       => FALSE,
    'tab-size'              => 20, //This option specifies the number of columns that Tidy uses between successive tab stops. It is used to map tabs to spaces when reading the input. Tidy never outputs tabs.
    'wrap-php'              => 0,
    'wrap-script-literals'  => TRUE,
    'escape-cdata'          => TRUE,
    'indent-cdata'          => TRUE,
    'numeric-entities'      => FALSE,
    'fix-uri'               => FALSE,
    'markup'                => TRUE
);

我一直在搞乱不同的PHP整理,但它没用。我甚至尝试将其输出为XML,但这没有帮助。如何在不破坏/解析我想要清理的源代码的</textarea>标记的情况下,让Tidy在第二个textarea中正确显示已清理的源代码?

1 个答案:

答案 0 :(得分:0)

诀窍是让浏览器根本不将输出的文本视为标记(因为你知道它真的想要),而是可以用<和{{1}替换&lt;>。 浏览器将运行并将&gt;呈现为&lt;,但由于浏览器不知道这是HTML标记的开头,我们现在已经欺骗浏览器进行明文响应。试一试:

<

如果一切顺利,那么这个极其简单的示例将证明您可以使用str_replace()解决所有问题,而不会牺牲代码而不必将头撞到墙上。 ......我的桌子旁边有一个大凹痕。

这个过程应该仍然适用于整洁,你的POST变量,只是在表单提交后收集所有信息,通过整理运行,然后通过str_replace函数运行它。应该完成它。万岁!