WinFuture-Forum.de: [php] Preg_match Für Php-source - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[php] Preg_match Für Php-source funktionen (namen und args) über regex auslesen


#1 Mitglied ist offline   _seym. 

  • Gruppe: aktive Mitglieder
  • Beiträge: 52
  • Beigetreten: 12. Februar 06
  • Reputation: 0
  • Geschlecht:Männlich

  geschrieben 27. August 2007 - 21:49

hi zusammen!

ich möchte php-source (meistens eine komplette datei, in der nur neue, benutzerdefinierte funktionen drinstehen) so per regex parsen, dass ich danach eine liste die funktionsnamen, der argumente und die komplette funktion als string enthält, habe.

nun ist mein problem die regex an sich. wie realisiere ich eine suche nach (eventuellen) verschachtelten geschweiften klammern? kann ich da mit (?R) rangehen? falls ja, wie? ^^

mfg,
_seym.
mfg,
_seym.
0

Anzeige



#2 Mitglied ist offline   dblay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.246
  • Beigetreten: 18. März 07
  • Reputation: 1

geschrieben 30. August 2007 - 10:24

Ich würde mit preg_match_all arbeiten. So müsstest du dir die komplizierten Rekursionen sparen können.

Ein entsprechender Regex könnte dann so aussehen:

/function\s+([a-z0-9_]+)\s*\((.*?)\)\s*\{(.*?)\}(?:![^\{]*?\})/si

Musst du mal ausprobieren, ich hab das Muster jetzt nicht getestet. Das erste Subpattern würde dir jedenfalls den Funktionsnamen liefern, das zweite die Argumente (könnte man dann per explode in ein Array umwandeln), und das dritte den Funktionscode. Hinter der geschlossenen geschweiften Klammer gibt es dann noch eine Look-ahead Assertion, um zu prüfen, dass sich keine Klammern mehr schließen, ohne dass vorher eine geöffnet wurde. Ohne diesen Teil würde er dir natürlich die Funktion bei der ersten schließenden Klammer abschneiden.

Edit: Die Flags sind hierbei sehr wichtig, da von .* auch Zeilenumbrüche gematched werden sollen, also "s". Damit man nicht das hin und her zwischen groß und klein hat, ist dann noch "i" für caseless angefügt.

Dieser Beitrag wurde von dblay bearbeitet: 30. August 2007 - 10:27

Zeit ist, was verhindert, dass alles gleichzeitig passiert.
0

#3 Mitglied ist offline   _seym. 

  • Gruppe: aktive Mitglieder
  • Beiträge: 52
  • Beigetreten: 12. Februar 06
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 30. August 2007 - 14:58

FETTE SACHE ^^ vielen dank. werd gleich mal ne php datei mit vielen funktionen gegen das muster matchen!
mfg,
_seym.
0

#4 Mitglied ist offline   _seym. 

  • Gruppe: aktive Mitglieder
  • Beiträge: 52
  • Beigetreten: 12. Februar 06
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 30. August 2007 - 15:17

haha klasse!!
ich musste sie noch ein wenig bearbeiten (die assertion wollte nich ganz, an der greedyness hab ich was verändert und ein paar feinschliffe gemacht) und siehe da: ausnahmslos alle funktionen werden mir ausgegeben!! hammer!

falls es jemanden interessiert, das ganze sieht dann so aus:

	$f = file_get_contents("viele_functions.php");
	
	$num = preg_match_all("/function\s+(?P<name>[a-z0-9_]+)\s*\((?P<args>[^\)]*)\)\s*\{(?P<body>.*?)\}(?![^\{]*?\})/si",$f,$p,PREG_SET_ORDER);
	
	foreach($p as $fn){
		$a = split(",",$fn['args']);
		foreach($a as $aa){
			if(strlen($aa)<1){
				$fns[$fn['name']]['args']=NULL;
				break;
			}
			$aa=split("=",trim($aa));
			$fns[$fn['name']]['args'][trim(@$aa[0])]=trim(@$aa[1]);
		}
		$fns[$fn['name']]['body']=$fn['body'];
	}
	if($num>0) { ksort($fns); var_dump($fns);}


mfg.
mfg,
_seym.
0

#5 Mitglied ist offline   Andy1988 

  • Gruppe: Mitglieder
  • Beiträge: 16
  • Beigetreten: 11. März 06
  • Reputation: 0

geschrieben 30. August 2007 - 23:54

Wenn ich mal fragen darf...
Wozu brauchst du das? :D


Reflection in PHP... Auch mal nicht schlecht ;)
0

#6 Mitglied ist offline   dblay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.246
  • Beigetreten: 18. März 07
  • Reputation: 1

geschrieben 31. August 2007 - 13:29

Zitat

die assertion wollte nich ganz
Lol - ja ich seh gerade, da hab ich versehentlich einen Doppelpunkt zu viel ;D

Aber freut mich, dass ich dir mit dem Vorschlag weiterhelfen konnte :cool:
Zeit ist, was verhindert, dass alles gleichzeitig passiert.
0

#7 Mitglied ist offline   _seym. 

  • Gruppe: aktive Mitglieder
  • Beiträge: 52
  • Beigetreten: 12. Februar 06
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 02. September 2007 - 14:40

wofür ich das brauche? ich entwickle im team individuelle cms. zwar bekommt jeder kunde sein eigenes, aber bestimmte benutzerdefinierte funktionen (und das sind einige) verwenden wir halt immer wieder. bis jetz war es so, dass man die dann immer aus den php-dateien raussuchen musste, nun erstelle ich eine datenbank mit diesen "snippets". und um die zu füttern kann man nun entweder die fkt als string geben oder ganze php-dateien reinladen und dann auswählen welche fkts man in die db übernehmen möchte. :) spielerei halt
mfg,
_seym.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0