[php/regex] Highlight code bouwen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
ok, ik ben nu begonnen met een soort algemene code highlighter in php maar loop tegen een aantal problemen aan. en doe dat in php dmv regular expressions.

ik ben geen ster in regular expressions, dus daarom klop ik bij jullie aan, maar ik heb natuurlijk wel eerst gezocht.
uit dit topic heb ik wel een deel kunnen halen maar niet mijn vragen:


nu heb ik al dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$foo = preg_replace("/.*\\[code\](.*)\\[\/code\].*/i","$1",$input,1);
  $foo = str_replace (" "," ",$foo);
  
  $foo = preg_replace("/\\[/i","<FONT color=\"#FF0000\">[</FONT><FONT color=\"#77FF77\">",$foo);
  $foo = preg_replace("/\]/i","</FONT><FONT color=\"#FF0000\">]</FONT>",$foo);
  
  $foo = preg_replace("/\(/i","<FONT color=\"#FF0000\">(</FONT><FONT color=\"#777777\">",$foo);
  $foo = preg_replace("/\)/i","</FONT><FONT color=\"#FF0000\">)</FONT>",$foo);
  
  $foo = preg_replace("/\{/i","<FONT color=\"#FF0000\">{</FONT><FONT color=\"#77FFFF\">",$foo);
  $foo = preg_replace("/\}/i","</FONT><FONT color=\"#FF0000\">}</FONT>",$foo);
  
  $foo = preg_replace("/\&lt;/i","<FONT color=\"#FF0000\">&lt;</FONT><FONT color=\"#7777FF\">",$foo);
  $foo = preg_replace("/\&gt;/i","</FONT><FONT color=\"#FF0000\">&gt;</FONT>",$foo);
  
  $foo = preg_replace("/\|/i","<FONT color=\"#FF0000\">|</FONT>",$foo);

  $input = preg_replace("/\\[code\].*\\[\/code\]/i","[code]".$foo."[/code]",$input,1);


't is wat chaotisch, met al die preg_preplace dingen, maar als alles werkt gooi ik het wel in een array :)

probleem 1:
ik heb nu dat je '(',')','{','}','[',']' hightlight, en de code er in ook, en dat werkt goed, maar nu wil ik dat als er '\\[' staat dat deze niet meegeteld wordt

ik heb op deze site al gezocht en alles door gelezen, maar snap niet of ik nou (?![\\\]) of [^[\\]] moet gebruiken..
beide werke niet namelijk :P
op de site staat dat ?![iets] de resulaten omdraait (soort not operator) maar ^ als eerste teken in een class([])
if it is used at the beginning of a character class, it reverses the meaning of the character class. Everything not included in the listed character set is matched
ik maa dan zoiets:
PHP:
1
  $foo = preg_replace("/[?1\\\]\(/i","<FONT color=\"#FF0000\">(</FONT><FONT color=\"#777777\">",$foo);
of
PHP:
1
  $foo = preg_replace("/[^[\\]]\(/i","<FONT color=\"#FF0000\">(</FONT><FONT color=\"#777777\">",$foo);



probleem 2:
het 2de probleem is dat ik nu gebruik maar van een extra variable ($foo) om de infomratie tussen de [ code] [/code] tags te veranderen.
nu werkt dit wel, maar het werkt slechts voor de laatste keer dat '[code]' voorkomt in de totale text ($input)
als er dus meerdere keren [code] tags gebruikt worden zie je alleen de laatste.
ik weet dat er een oplossing is door limit van preg_replace op 1 te zetten (wat ik nu heb) en dan een soort for loopje te maken, maar dit vind ik nogal slecht.

ik vroeg me af of ik niet op de een of andere manier alles in 1 of meerdere preg_replace dingen kan doen die universeel ALLE [code] tags afgaan.

ikzelf dacht aan zoiets:
PHP:
1
  $input = preg_replace("/.*\\[code\](.*)\\[(.*)\\[\/code\].*/i","$1<FONT color=\"#FF0000\">[</FONT><FONT color=\"#77FF77\">$2",$input);

en dat dan voor alle tags ('(',')','{','}','[',']')
dit werkt opzich wel, maar alleen voor de laatste keer dat het teken ('[' in dit geval) in de text voorkomt
ik ben er inmiddels wel achter dat het niet slim van me is op 2 vars te gebruiken, en probeer $foo dus weg te krijgen, maar ik heb geen idee hoe dit aan te pakken :(


probleem 3:
ben ik nog niet echt aan toe gekomen, maar nou ik toch bezig ben: qoutes!
hoe herken je aan een ", ' of ` of het een openen of sluiten quote is.
je moet ze dan parsen in groepen van 2 neem ik aan?
hoe zou ik dat moeten aanpakken?


edit: waarom werken [pre] tags niet op dit forum? dat is best onhandig voor dit soort topics

edit2: typo's + sorry voor layout verneuking

[ Voor 48% gewijzigd door BasieP op 14-11-2003 11:40 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

[q]waarom werken
 tags niet op dit forum?
Omdat je misschien [code] ... [/code] bedoelt :? ;)

Ik heb eigenlijk maar een heel simpel en kort antwoord voor je. Als je puur met regular expressions code wilt highlighten kan je het wel shaken. Dat gaat je niet lukken. Er zijn nog wat opties:
  1. zelf een stackbased parser gaan schrijven. hf :Y)
  2. Een parsergenerator opzoeken en kijken of de zooi die daar uit komt te vertalen is naar PHP
  3. .oisyn lief aankijken en vragen of hij zijn sourcecode nog 's vrij gaat geven voor de highlighters op dit forum :P

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
1: een wattus? :X (* BasieP gaat het niet eens opzoeken als ie je smily er achter ziet)
2: dat kan ik idd wel is doen
3: * BasieP heeft weinig hoop daarop, en bovendien wil ik het eigenlijk zelf maken (meer een uitdaging dan het gewoon kopieren van code)

[offtopic]en over die pre tags:
ik bedoelde eigenlijk dat als ik de text [ code ] wil laten zien, zonder dat het geparsed word dat ik dacht om dat met
[ code][/code] 
te doen
maar [norml] werkt natuurlijk ook dan :X [/][/]

[ Voor 18% gewijzigd door BasieP op 14-11-2003 12:50 ]

This message was sent on 100% recyclable electrons.