Ingewikkelde reguliere expressie
Ik ben bezig met oefenen met reguliere expressies.
Nu wil ik een stuk javascript van syntax highlighting voorzien.
Ik wil om te beginnen het woord function replacen door '<span class="function">function</span>';
Het function keyword in javascript is iets anders dan andere keywords.
Normaal gesproken is een keyword een woord, dus moeten er op zijn minst aan beide kanten whitespaces tegenaan staan, en mag het niet worden gereplaced als het in een string staat (dus tussen ' of ").
Bij het function keyword komt er nog een regel bij.
function kan namelijk:
- een anonieme functie zijn, dus er kunnen haakjes tegen staan.
- Een gewone functie zijn:
- Een closure zijn:
Bij al deze vormen van code, wil ik het function woord omringen met een span tag.
Ik heb nu een regex die gedeeltelijk werkt, maar het lijkt net alsof dit zo ingewikkeld is, dat het niet kan met een regex.
Kan iemand mij helpen?
Gewijzigd op 20/10/2015 18:57:07 door Mark Hogeveen
Code (php)
1
2
3
2
3
<?php
$string = str_replace(" function ", ' <span class="function">function</span> ', $string);
?>
$string = str_replace(" function ", ' <span class="function">function</span> ', $string);
?>
Let op de spaties voor- en achteraf.
Als je niet ook nog de complete syntax wilt controleren:
Code (php)
1
2
3
2
3
<?php
$string = preg_replace("#([ (])(function)([ (])#", '$1<span class="$2">$2</span>$3', $string);
?>
$string = preg_replace("#([ (])(function)([ (])#", '$1<span class="$2">$2</span>$3', $string);
?>
Dit controleert of het woord "function" ergens staat, waarbij het woord voorafgegaan mag worden door ofwel een spatie, ofwel een haakje-openen.
En na dit woord mag een spatie danwel een haakje-openen staan.
Dit covert
function aap()
x = function() {}
(function() {})
en ook
(function(a) {})
maar niet
x=function() {}
noch een enter voor function als in:
x =
function(){}
--
ik heb ook direct "function tussen () gezet in de regex. Daarmee vooruitlopend op de mogelijkheid dat er ook andere woorden gezocht kunnen worden die op gelijke manier behandeld moeten worden. (in geval van function misschien niet van toepassing, maar wel voor zaken als .substr(), .length() etc
--
edit:
in het replace stuk de $1 en $3 buiten de span-tag
Toevoeging op 21/10/2015 15:53:15:
mogelijke verbetering:
Code (php)
1
2
3
2
3
<?php
$string = preg_replace("#([\s=(])(function)([\s(])#", '$1<span class="$2">$2</span>$3', $string);
?>
$string = preg_replace("#([\s=(])(function)([\s(])#", '$1<span class="$2">$2</span>$3', $string);
?>
ipv een spatie mag wegens \s elke wit-ruimte gebruikt worden: tab of enter dus ook.
en er mag voor function nu ook een = staan.
Gewijzigd op 21/10/2015 15:49:40 door Ivo P