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.