Avatar billede ostehamster Nybegynder
11. april 2004 - 00:06 Der er 8 kommentarer og
1 løsning

Parser, kan det laves bedre?

Hejsa

Jeg har lavet en parser, der læser en php fil, og finder alle funktioner, og dens parametre, men kan det ikke laves lettere?

___KODE___
<?php
function findfunktion($fil) {
   
    $handle = fopen($fil, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);   
       
        // Fjerne mellemrum
        $buffer = str_replace(" ","",$buffer);
       
        // Fjerne "function" fra stringen, og laver buf til "function" + string, dvs. det det ville være, hvis der er en funktion
        $buf = "function" . str_replace("function","",$buffer);
       
        // Hvis $buffer indeholdte "function" og første bogstav er "f"
        if($buffer == $buf) {
            // explode ved (, og tager første del, dvs. funktionensnavn
            $buf = str_replace("function","",$buffer);
            $buf = (explode("(",$buf));
            $array['navn'][] = $buf[0];
           
            $buf = (explode(")",$buf[1]));
            $array['argument'][] = $buf[0];
        }
    }
    fclose($handle);
   
    $ud="";
    for($i=0;$i<sizeof($array['navn']);$i++) {
        $ud.="<b>Navn:</b> <i>" . $array['navn'][$i] . "</i>, <b>argument:</b> <i>" . $array['argument'][$i] . "</i><br>";
    }
   
    return $ud;
}

echo findfunktion("/var/www/html/cms/system/include/admin/funktion.lib.php");
?>
___KODE___

mvh
Christoffer
Avatar billede dennismp Nybegynder
11. april 2004 - 00:42 #1
ja

0001: <?php
0002:    $file = file_get_contents('form.php');
0003:
0004:    if( preg_match_all("#function\W+(\w+)\W*(\(.*\))#", $file, $matches ) ) {
0005:        for($i=0;$i<count($matches[1]);$i++)
0006:            print "Function = <code>{$matches[1][$i]}</code> Arguments = <code>{$matches[2][$i]}</code><br />";
0007:    }
0008: ?>

Det kan godt være at der skal arbejdes lidt mere med den, men jeg tror det virker.

Du kan se det her evt:
http://dennis.moellegaard.dk/v4/php/findFunction.php?source=1

der søger den igennem:
http://dennis.moellegaard.dk/v4/php/form.php?source=1

og finder dem alle
Avatar billede ostehamster Nybegynder
11. april 2004 - 00:49 #2
Ja, det fyler jo alt andet lige mindre :)

Takker
Avatar billede ostehamster Nybegynder
11. april 2004 - 00:56 #3
Hvordan laver man #function\W+(\w+)\W*(\(.*\))# om, så den ikke tager () med til argumenterne?
Avatar billede dennismp Nybegynder
11. april 2004 - 00:57 #4
prøv: #function\W+(\w+)\W*\((.*)\)#
Avatar billede ostehamster Nybegynder
11. april 2004 - 01:00 #5
Piv smart, det kunne være man skulle læse lidt om det der "regular expression", det kan nogle ting
Avatar billede dennismp Nybegynder
11. april 2004 - 01:03 #6
Har samlet lidt links, da du ikke er den første der gerne vil lære mere :-)

http://www.regular-expressions.info/reference.html
http://etext.lib.virginia.edu/helpsheets/regex.html
http://regexlib.com/ (en samling af regexs)
Avatar billede ostehamster Nybegynder
11. april 2004 - 01:10 #7
Det virker også i mange andre sprog ikke, mener at have set det, da jeg læste noget om Perl
Avatar billede dennismp Nybegynder
11. april 2004 - 01:19 #8
Jo, php er fungere med mange af perls finurligheder hvad angår regulære udtryk. Men der findes også kommandoer i unix som kan finde ud af det og nogle editorer kan man angivet et regulært udtryk som man kan søge efter.

Det er bare med at få brugt det, ellers glemmer man det skidt :(
Avatar billede ostehamster Nybegynder
11. april 2004 - 01:36 #9
Det jo det, så jeg må hellere få lært det, ellers kan jeg jo ikke glemme det igen :)

Takker, og god weekend
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester