2012-04-08 18 views
1

Ich habe eine HTML-Formularseite (test.php) mit 2 Textareas und einem Absenden-Button. Anstatt den Quellcode zu kopieren, den ich immer formatieren und fest codieren möchte, habe ich den ersten Textbereich erstellt, damit ich den zu reinigenden Code hineinkopieren kann. Dann, wenn Sie auf den Submit-Button klicken, wird das Formular auf die gleiche Seite gestellt und zeigt den aufbereiteten Quelltext im 2. Textbereich an. Das Anzeigen dieses behobenen Quellcodes ist das Problem. Wenn Sie den folgenden Code über HTML ordentlich übergeben und versuchen, die Ausgabe in einem Textfeld anzuzeigen, wird die Ausgabeanzeige unterbrochen. Was ich damit meine ist, wenn Sie bemerken, ich habe </textarea> innerhalb der folgenden HTML-Code. Sobald Tidy darauf stößt, schließt es den Textbereich und analysiert den Rest der Informationen des Quellcodes, als wäre es ein Teil des HTML-Dokuments, wodurch meine gesamte HTML-Formularseite (test.php) zerstört wird.PHP Tidy: Breaks Textareas

SAMPLE SOURCE CODE, DIE ICH TIDY in HTML AM PASSING:

<!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 Paramter:

$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 
); 

Ich habe um mit den verschiedenen params von PHP ordentlich durcheinander, aber es ist nutzlos. Ich habe sogar versucht, es als XML auszugeben, aber das hat nicht geholfen. Wie kann ich machen, dass Tidy den gesäuberten Quellcode in der 2. textarea korrekt anzeigt, ohne das </textarea> Tag des Quellcodes, das ich zu bereinigen versuche, zu zerlegen/zu analysieren?

Antwort

0

Der Trick ist der Browser nicht den ausgegebenen Text als Tags überhaupt behandeln (weil Sie wissen, dass es wirklich will), sondern Sie < mit &lt; und > mit &gt; ersetzen kann. Der Browser wird durchlaufen und es wird &lt; als < rendern, aber weil der Browser nicht wusste, dass die Öffnung eines HTML-Tags war, haben wir jetzt unseren Browser in Klartext-Antworten ausgetrickst. Geben Sie dieses ein Schuss:

<!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> 

Wenn alles gut an Ihrem Ende geht, diese grob vereinfachend Beispiel wird zeigen, dass Sie alle lösen Ihre Probleme mit str_replace(), ohne den Code zu opfern und ohne Ihren Kopf gegen eine bang Mauer. ... Meine Wand hat eine große Delle direkt neben meinem Schreibtisch.

Dieser Prozess sollte immer noch mit ordentlich arbeiten, und Ihre POST-Variablen, sammeln Sie einfach alle Informationen nach dem Senden des Formulars, führen Sie es durch ordentlich, und führen Sie das durch die Funktion str_replace. Das sollte es machen. Hurra!