Gå til innhold

regexp for å fange HTML-atributter


Anbefalte innlegg

Hei, der!

Jeg holder på å lage et søtt lite script for syntax highlighting og omforvandling av HTML. Dette for å lette arbeidet til dem som lager tutorials om HTML. Scriptet oversetter < til &lt; osv. Bruker htmlspecialchars() til den jobben.

Har en rekke regexps til å få fatt i deler av HTML-koden og legge farge på det, men sliter veldig med å få hentet ut atributtene.

Akkurat nå bruker jeg denne regexp'en:
[code]
$input = preg_replace("#<span style=\"color:(.+?);\">(.+?)&quot;(.+?)&quot;(.+?)</span>#is",
 "<span style=\"color:#000099;\">\\2</span><span style=\"color:#0000FF;\">&quot;\\3&quot;</span><span style=\"color:#000099;\">\\4</span>", $input);
[/code]

...men den henter bare ut første atributt. Flere atributter blir rett og slett ignorert.

PS: Alle span-taggene er kode for highlighting, lagt til av tidligere regexp's.
PS2: En HTML-atributt er noe inni en HTML-tag som er innkapslet i "", for eksempel
[quote]
<input type=[b]"text"[/b] />
[/quote]
Det som er satt i fet tekst vil jeg hente ut og sette farge på. Endret av jorgenindahouse
Lenke til kommentar
Videoannonse
Annonse

Er ikke helt sikker på hva du mener, men lagde et eksmpel på en regexp-funksjon som kan fikse det jeg tror du ber om. Du kan sikkert arbeide ut i fra den, tror du ikke?

 

<?

$code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" test="test">
</head>

<body onload="test">

</body>
</html>';


function attr($match) {

return htmlspecialchars("<" . $match[1] . " ")
. preg_replace("/([a-z\-]+)=(".*?")($| )/", "\\1=<b>\\2</b>\\3", $match[2])
. htmlspecialchars(">");
}



echo nl2br(preg_replace_callback("/<([a-z]+) (([a-z\-]+="(.*?)" *)*)\/?>/is", 'attr', htmlspecialchars($code))); 

?> 

Lenke til kommentar

Hmm.

 

Nå bruker jeg koden din, og den funker nesten helt fint. Den fargelegger atributtene slik den skal, men den ødelegger tagger som lukkes i samme tag. (<br />, <hr />). Den fjerner rett og slett skråstreken. I tillegg legger den til mellomrom på diverse steder.

 

Her er koden slik jeg bruker den nå:

 

function attr($match) {
 	return htmlspecialchars("<" . $match[1] . " ")
 	. preg_replace("#([a-z\-]+)=(".*?")($| )#", "\\1=<span style=\"color:#0000FF;\">\\2</span>\\3", $match[2])
 	. htmlspecialchars(">");
 }
 
 $input = preg_replace_callback("#<([a-z]+) (([a-z\-]+="(.*?)" *)*)\/?>#is", 'attr', $input); 

 

Har endret litt på den, men har ikke rørt regexp'en noe særlig. Har ikke helt satt meg inn i hva den gjør, skjønner du.

Lenke til kommentar

<?

$code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" test="test" />
</head>

<body onload="test" />

<hr />


</body>
</html>';


function attr($match) {

return htmlspecialchars("<" . $match[1] . " ")
. preg_replace("/([a-z\-]+)=(".*?")($| |\n)/", "\\1=<b>\\2</b>\\3", $match[2])
. htmlspecialchars(">");

}


echo '<pre>';
echo preg_replace_callback("/<([a-z]+) (([a-z\-]+="(.*?)" *)*.*?)>/is", 'attr', htmlspecialchars($code)); 

?> 

 

Ikke testet noe særlig, men den skal iallfall ikke fjerne disse skråstrekene. Du må presisere bedre hva du mener med at den legger til mellomrom av og til.

 

Om du skal lage en egen HTMLparse-funksjon, er det vel å forlange at du setter deg inn i regexpen?

Lenke til kommentar

Tusen takk. Funker utmerket nå, selv om jeg måtte modifisere litt på den. Husk at tall også er lov i HTML-tagger... ;)

 

Mellomrommene som kom av og til kom som følge av noe rot lengre oppe i koden.

 

 

Igjen: Tusen takk! Dette problemet har irritert meg en liten stund nå. :)

 

EDIT: link til HTMLizer

Endret av jorgenindahouse
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...