[PHP] Regular Expression voor commentaar in code

Pagina: 1
Acties:
  • 166 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn probleem is het volgende: ik ben een kleine UBB-parser aan het maken die ook code-blokken in VB.NET opmaak weergeeft. Tot nu toe werkt het allemaal prima met het highlighten van de keywords en commentaar, maar wanneer ik een keyword in commentaar zet, dan wordt deze gewoon ge-highlight.

Wat ik eigenlijk wil is door middel van preg_replace alle code te doorlopen, behalve die plekken waar een ' of REM begint, dan mag de rest van de string worden overgeslagen.

Zo ook voor strings: Als er bijvoorbeeld staat MessageBox.Show("Do Nothing"), dan worden de woorden Do en Nothing gehighlight, simpelweg omdat Do en Nothing keywords zijn in VB.NET.

Bij deze situaties kom ik er dus niet uit:
code:
1
2
3
4
' Do Nothing
MessageBox.Show("Do Nothing")
en
MessageBox.Show("Do Nothing") ' Show MessageBox: Do Nothing

Ik ben hier nu al 2 volle dagen mee aan het prutten, ook met RegExBuddy enzo, maar ik krijg het niet voor elkaar!

De code die ik gebruik is de volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Function highlights $words in $str with the specified $color 
function highlight_words($str, $words, $color = 'blue') { 
    if(is_array($words)) { 
        foreach($words as $k => $word) { 
            $pattern[$k] = "/\b($word)\b/is"; 
            $replace[$k] = '<font style="color:'.$color.';">$1</font>'; 
         } 
    } else { 
        $pattern = "/\b($words)\b/is"; 
        $replace = '<font style="color:'.$color.';">$1</font>'; 
    } 

    return preg_replace($pattern, $replace, $str); 
} //  end highlight_words

function ConvertCodeToHTML($Code) {
    // Highlight Visual Basic .NET KeyWords.
    $VBNETKeyWords = array(
            "KeyWord"
            );
    $Code = highlight_words($Code, $VBNETKeyWords); 

    $Code = '<p><font color="#808080">code:</font><div class=codeblock><div class=code>'.$Code.'</div></div></p>';

    return $Code;
} // end ConvertCodeToHTML

function ConvertUBBToHTML($UBB = "") {
    // [ code ] handling
    $UBB = preg_replace("/\\[code\](.+?)\\[\/code\]/ise", "ConvertCodeToHTML('$1')", $UBB);

    return $UBB;
} // end ConvertUBBToHTML

[ Voor 46% gewijzigd door Verwijderd op 05-08-2005 16:41 ]


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Parser maken... lijkt mij de beste oplossing.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

kijk eens naar de syntax highlighter van .oisyn - deze gebruiken we ook hier op GoT (in aangepaste en uitgebreide vorm).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Die ' verwerken is waarschijnlijk wel mogelijk, maar die strings niet. Zoiets is simpelweg onmogelijk met regular expressions aangezien quotes escaped kunnen worden, er kunnen er meer voorkomen en ze kunnen unbalanced zijn in VB.NET.

Wat je nodig hebt is een tokeniser om de code te parsen, die kan het doen met begrip van de code en dus de goede beslissing nemen in strings en met escapes of dubbele karakters, zoals een regex nooit zal kunnen.

Kijk hier voor een voorbeeldje in VB6 van een aanpak die beter werkt:
http://www.pscode.com/vb/...?txtCodeId=39850&lngWId=1

Deze parsed volgens mij nog geen escapes quotes in strings (" quote in string- ->""<-- "), maar dat moet geen probleem zijn om toe te voegen.

[ Voor 4% gewijzigd door Gerco op 05-08-2005 19:53 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!