Olen yrittänyt saada seuraavan koodin toimimaan okein:
<style> .att {color:#f00;} .kom {color:#34803a;} .arv {color:#8000ff;} .tag {color:#00f;} .ent {font-style:italic;} </style> <?php function korostaHtml($koodi) { $koodi = htmlentities($koodi); $etsi = array( '~(\s)([a-z].*?=)~', // attribuutit '~(<\!--.*?-->)~s', // kommentit '~("[a-zA-Z0-9\/].*?")~', // arvot '~(<[a-z]+)~', // avaustagien aloitukset '~(/*>)~', // avaustagien ja itsensä sulkevien tagien lopetukset '~(</[a-z].*?>)~', // sulkutagit '~(&.*?;)~', // entiteetit ); $korvaa = array( '$1<span class="att">$2</span>', '<span class="kom">$1</span>', '<span class="arv">$1</span>', '<span class="tag">$1</span>', '<span class="tag">$1</span>', '<span class="tag">$1</span>', '<span class="ent">$1</span>', ); $koodi = preg_replace($etsi, $korvaa, $koodi); return '<pre>' . $koodi . '</pre>'; } echo korostaHtml(' <!-- This is an HTML comment --> <a href="home.html" style="color:blue;">Home</a> <p>Go & here.</p> <!-- This is an HTML comment --> <form action="/login.php" method="post"> <input type="text" value="User Name" autofocus /> </form> '); ?>
Ongelmia on kaksi:
– Kommentin suurempi kuin -merkki tulkitaan virheellisesti aloitustagin lopuksi
– Boolean-attribuutteja ei tunnisteta ollenkaan
Olen yrittänyt saada järkevää ratkaisua, mutta koko homma muuttuu hirveäksi purkaksi, eikä koodi ala silti toimimaan oikein.
Kaikki korvaukset pitää yhdellä lausekkeella ja esimerkiksi funktiolla preg_replace_callback, jotta samaa kohtaa ei käsiteltäisi useaan kertaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.