uepselon: Sehr schweres Problem mit regulären Ausdrücken

Hallo,

ich bin grad dabei einen String mit RegExp auf Variablen zu untersuchen und diese dann
in ein Array zu hinterlegen.

Hier der Inhalt vom String (aus einer anderen php Datei eingelesen):

<html>
<body>

<?php

global $var0;
$var1 = 1;
$var2.= 2;
$var3+=$var4.$var5;
$GLOBALS["$var6"] = "next";
$GLOBALS[$var7] = "next";
$var8 = "$var9$var10 $var11/Berta";
?>
</body>
</html>

Mein RegExp Versuch:

preg_match_all("/([$].*?)[\s.="';,+-/$]/",$string, $res);

for($i=0;$i<count($res[1]);$i++)
echo $res[1][$i];

Und hier das Ergebnis der echo Ausgabe:

$var0
$var1
$var2
$var3
$var4
$var5
$GLOBALS[
$var6
$GLOBALS[
$var8
$var9
$var11

Wie man unschwer erkennen kann, ist der reguläre Ausdruck in preg_match_all noch nicht ganz
optimal, so werfen [] Klammern und zwei Variablen hintereinander noch Probleme auf.
Ebenso sollten, Standard PHP Vars wie $GLOBALS, $GET etc. nicht als Ergebnis kommen.

Falls sich hier jemand mit RegExp auskennen sollte und noch Tipps hat, wäre ich sehr froh.
Ich komme jedenfalls nicht mehr weiter.

Gruß

ueps

  1. Hi Y,

    So schwer ist das nun nicht, nur kann es beliebig aufwändig werden.

    Um alle Variablen rauszufischen würde ich einfach nur nach gültigen Namen suchen:
    /([$][_a-z][_a-z0-9]*)/i
    Das sollte in deinem Testfall erstmal alle Fälle richtig rausfischen.

    Kommen wir zu den vordefinierten Variablen ($GLOBALS ...).
    Entweder du erkennst sie anhand ihrer Schreibweise (komplett Grossbuchstaben) oder anhand ihres Namens.
    komplett Grossbuchstaben wäre:
    /(\$[A-Z]+)/
    und um sie 'loszuwerden' einfach vorher gegen "" ersetzen.
    Ansonsten die festen Namen einfach per strtr(); gegen "" austauschen.
    Ebenso solltest du alles was in 'einfachen Anführungszeichen' steht vorher entfernen, ggfls. auch Kommentare.
    Das ist _korrekt_ nur mit RegExp nicht möglich, ggfls. aber gut genug.
    Fallstrick sind ausserdem escapte $-Zeichen ("$aetsch").

    Gruss,
      Carsten

    1. Hi,

      So schwer ist das nun nicht, nur kann es beliebig aufwändig werden.

      Um alle Variablen rauszufischen würde ich einfach nur nach gültigen Namen suchen:
      /([$][_a-z][_a-z0-9]*)/i
      Das sollte in deinem Testfall erstmal alle Fälle richtig rausfischen.

      :-) Danke, das hat prima geklappt.

      Kommen wir zu den vordefinierten Variablen ($GLOBALS ...).
      Entweder du erkennst sie anhand ihrer Schreibweise (komplett Grossbuchstaben) oder anhand ihres Namens.

      Hab ich per Namen gefiltert.

      Fallstrick sind ausserdem escapte $-Zeichen ("$aetsch").

      Ja dazu muss ich mir noch was überlegen.

      Danke und Gruß

      ueps