2012-04-08 6 views
1

2つのテキストエリアと送信ボタンがあるhtmlフォームページ(test.php)があります。フォーマットして毎回ハードコードするソースコードをコピーするのではなく、最初のテキストエリアを作成して、クリーニングされるコードをコピーすることができます。その後、送信ボタンを押すと、フォームは同じページに投稿され、2番目のテキスト領域に整形されたソースコードが表示されます。 この簡潔なソースコードを表示することが問題です。次のコードをHTML tidyに渡し、出力をテキストエリアに表示しようとすると、出力表示が中断されます。私が意味することは、あなたが気付いた場合、私は</textarea>が次のHTMLコードの中にあることです。 Tidyが直面するとすぐに、テキストエリアを閉じて、HTMLドキュメントの一部であるかのようにソースコードの残りの情報を解析して、HTMLフォームページ全体(test.php)を破棄します。PHP Tidy:テキストエリアを分割します

私はTIDY HTMLに渡すAMサンプルソースコード:

<!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の異なるのparamsをいじりされており、しかし、それは役に立たない。私はそれをXMLとして出力しようとしましたが、それは役に立ちませんでした。クリーンアップしようとしているソースコードの</textarea>タグを改ざん/解析せずに、2番目のテキストエリアにあるクリーンなソースコードをTidyに正しく表示させるにはどうすればよいですか?

答えて

0

トリックは、(あなたはそれが本当にしたい知っているので)すべてのタグとして出力されたテキストを扱わないブラウザを持っている代わりに、あなたは&gt;&lt;><を置き換えることができます。 ブラウザが実行され、&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関数を通して実行します。それはそれを完了する必要があります。やめ!