RegEx

Tobi81

Mitglied
Hallo Forum,

ich bin gerade dabei RegEx zu lernen und habe auch gleich ein paar Probleme...

Ich möchte meinen Quellcode per preg_match_all nach Funktionen durchsuchen.
Gedacht habe ich da an preg_match_all("/(function)(.*?)\(/",$datei,$ergebnisse);

Dadurch erhalte ich den Funktionsnamen.
Also bei
function test() { }
den Funktionsnamen "test".

Nun möchte ich alle Funktionsaufrufe suchen, die "test(" oder "test (" enthalten, und NICHT mit "function" beginnen.

Wie löse ich das am besten?



Vielen Dank,

Tobias
 
Für Functions:

PHP:
<?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = 'function test() 
{
  if(1 != 1) { die(\"Lügner\"); }

  
}

function test() 
{
  if(1 != 1) { die(\"Lügner\"); }

  
}';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '~function\s(.*?)\({1}(.*?)\){1}\s{1,2}(\{){1}(.*?)\}[^\}](\s){1,}\}~is';
  //
  // RegExp auswerten
  //
  $result = preg_match_all($pattern, $subject, $subpattern);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Der verwendete Reguläre Ausdruck trifft auf den zu durchsuchenden Text '.
       (($result) ? $result.' mal ' : 'nicht ').'zu.</p>';
  //
  // Unterausdrücke ausgeben
  //
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
?>

Augabe:


Array ( [0] => Array ( [0] => function test() { if(1 != 1) { die("Lügner"); } } [1] => function test() { if(1 != 1) { die("Lügner"); } } ) [1] => Array ( [0] => test [1] => test ) [2] => Array ( [0] => ) { if(1 != 1 [1] => ) { if(1 != 1 ) [3] => Array ( [0] => { [1] => { ) [4] => Array ( [0] => die("Lügner"); [1] => die("Lügner"); ) [5] => Array ( [0] => [1] => ) )
 
Reguläre Ausdrücke sind dafür eigentlich nicht geeignet. Welche Sprache untersuchst du denn?
 
KD3: Danke für dein Beispiel. Jedoch kommt es mir eigentlich darauf an die Funktionsaufrufe zu finden. Also alles was den Funktionsnamen + ( findet, aber nur wenn KEIN "function" davor ist. Also nur die Aufrufe der Funktion, nicht die Definition.


Gumbo: PHP Scripte will ich damit untersuchen.
 
Okay, super, davon habe ich noch nicht gehört. Das werde ich mir auf jeden Fall mal genauer anschauen.

Trotzdem würde ich noch gerne wissen wie der RegEx aussehen muss, damit ich Funktionsaufrufe finde ohne die Funktionsdefinition ansich. Also OHNE das Wort "function" davor.

Vielleicht kann mir da jemand noch helfen?
 
Hi,

ich wüsste nicht, dass es möglich ist, eine Zeichenkette zu negieren (vielleicht belehrt mich jemand eines besseren). Was Du machen könntest, ist, alle Funktionsaufrufe und -definitionen zu finden und das Ergebnisarray zu filtern, je nachdem, ob das Wort davor "function" ist. Ich würde lieber gleich den PHP-Tokenizer nutzen.

LG
 
Dieses Problem ist mit regulären Ausdrücken allein effektiv nicht zu lösen. Denn was ist mit Zeichenfolgen dieser Art, die beispielsweise in Zeichenkettenauszeichnungen oder Kommentaren vorkommen?
Was spricht eigentlich dagegen, den PHP-eigenen Tokenizer zu verwenden?
 
Oki, ich habe mir jetzt mal die Tokenizer angeschaut, finde es aber auch schwer damit zu arbeiten.

Diesen PHP Code lasse ich durch den Tokenizer laufen:
<?php
function test() {
echo "Dies ist eine Testausgabe";
}
test();
?>
Dabei kommt folgendes raus:
Token gefunden 367 (T_OPEN_TAG): <?php
Token gefunden 333 (T_FUNCTION): function
Token gefunden 370 (T_WHITESPACE):
Token gefunden 307 (T_STRING): test
Zeichen gefunden : (
Zeichen gefunden : )
Token gefunden 370 (T_WHITESPACE):
Zeichen gefunden :{
Token gefunden 370 (T_WHITESPACE):

Token gefunden 316 (T_ECHO): echo
Token gefunden 370 (T_WHITESPACE):
Token gefunden 315 (T_CONSTANT_ENCAPSED_STRING): "dies ist eine testausgabe"
Zeichen gefunden :;
Token gefunden 370 (T_WHITESPACE):

Zeichen gefunden :}
Token gefunden 370 (T_WHITESPACE):

Token gefunden 307 (T_STRING): test
Zeichen gefunden : (
Zeichen gefunden : )
Zeichen gefunden :;
Token gefunden 370 (T_WHITESPACE):

Token gefunden 369 (T_CLOSE_TAG): ?>
Bei meinem Problem muss ich ja erst analysieren welche Funktionen es gibt.
Das stelle ich mir ja noch nicht so schwer vor. Nach T_FUNCTION suchen und der nächste T_STRING ist dann der Funktionsname.

Nur wie suche ich jetzt am besten nach den Funktionsaufrufen? :confused:


Vielleicht kann mir da noch jemand einmal helfen... :)


Vielen Dank,
Tobias
 
Zuletzt bearbeitet:
Zurück