1

2 つのテキストエリアと送信ボタンを含む html フォーム ページ (test.php) があります。毎回フォーマットしてハードコーディングしたいソースコードをコピーする代わりに、最初のテキストエリアを作成して、クリーンアップするコードをそこにコピーできるようにしました。次に、送信ボタンを押すと、フォームが同じページに投稿され、2 番目のテキスト領域に整理されたソース コードが表示されます。この整頓されたソースコードを表示することが問題です。 次のコードを HTML tidy で渡し、出力をテキストエリアに表示しようとすると、出力表示が壊れます。つまり、気がつけば私は</textarea>次のhtmlコードの内部。Tidy がそれに遭遇するとすぐに、テキストエリアを閉じ、ソース コードの残りの情報を 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 パラメータ:

$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 tidyのさまざまなパラメータをいじっていますが、役に立ちません。XMLとして出力しようとさえしましたが、それは役に立ちませんでした。</textarea>きれいにしようとしているソースコードのタグを壊したり解析したりせずに、Tidy にきれいにされたソースコードを 2 番目のテキストエリアに正しく表示させるにはどうすればよいですか?

4

1 に答える 1

0

秘訣は、ブラウザが出力されたテキストをタグとしてまったく扱わないようにすることです(本当に望んでいることがわかっているため)。代わりに、 と で置き換えること<&lt;でき>ます&gt;。ブラウザは実行され、&lt;としてレンダリングされます<が、ブラウザはそれが HTML タグの開始であることを認識していないため、ブラウザをだまして平文の応答にします。これを試してみてください:

<!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>
</head>    
<?PHP
$text = "</textarea>What's up?"; //Setting a potentially problematic string.

$text = str_replace("<", "&lt;", $text); //Do a find and replace for the < and save it back to the final variable to be rendered later
$text = str_replace(">", "&gt;", $text); //Do a find and replace for the > and save it back to the final variable to be rendered later.
?>
<body>
<div id="wrapper">
<textarea name="css" id="css" cols="150" rows="18">
<?php echo (isset($text) ? $text : ''); ?>
</textarea>

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

すべてがうまくいけば、コードを犠牲にすることなく、壁に頭を打ち付けることなく、str_replace() を使用してすべての問題を解決できることを、この非常に単純化しすぎた例で示します。...デスクのすぐ横の壁に大きなへこみがあります。

このプロセスは引き続き tidy で機能し、POST 変数は、フォームの送信後にすべての情報を収集し、tidy を介して実行し、str_replace 関数を介して実行するだけです。それはそれを成し遂げるはずです。万歳!

于 2013-04-06T10:27:27.557 に答える