Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Eregi i analiza funkcji
Forum PHP.pl > Forum > PHP
Bastion
Witam, pisze sobie drobny skrypt do analizy skladni i budowy funkcji , narazie mam cos takiego :

  1. <?php
  2. $test = "function prefix_foo($input, $param_1 = 'value_1', $param_2 = 'va)lue,2', $param_3 = 345, $param_4)";
  3.  
  4. $eregi = 'function[ ]{1,}(prefix_[_0-9a-z]{1,})[ ]{0,}\([ ]{0,}'; // funkcja i nazawa
  5. $eregi.= '((\$[_]{0,1}[_a-z0-9]{1,}[ ]{0,}[=]{0,1}[ ]{0,}['_),a-z0-9']{0,}[ ]{0,}[,]{0,1}[ ]{0,}){0,10})'; // parametry
  6. $eregi.= '[)]{1}';
  7. print $eregi;
  8. if (eregi($eregi, $test, $foo))
  9. {
  10. print '<pre>';
  11. print_r($foo);
  12. print '</pre>';
  13. }
  14. ?>


wynik otrzymamy taki

Kod
Array
(
    [0] => function prefix_foo($input, $param_1 = 'value_1', $param_2 = 'va)lue,2', $param_3 = 345, $param_4)
    [1] => prefix_foo
    [2] => $input, $param_1 = 'value_1', $param_2 = 'va)lue,2', $param_3 = 345, $param_4
    [3] => $param_4
)


gdzie
[1] => nazwa funkcji
[2] => parametry
[3] => nie wiem skad sie to wzielo :/

i teraz nie mam pomyslu jak rozbic parametry na tablice, tak by okreslic czy parametr jest wymagany, czy opcjonalny z domyslna wartoscia.
devnul
rozbij przez explode po przecinkach i sprawdzaj poszczegulne elementy pod kątem wystepowania w nich znaku równości, jeśli występuje to parametr jest opcjonalny, jeśli nei to obowiązkowy
Bastion
nie bardzo sie to sprawdzi przy parametrze :

$param_2 = 'va)lue,2'

added: a moze istnieje jakis gotowy sposob oferowany przez php jesli znam nazwe funkcji
dr_bonzo
Nie odkrywasz ponownie kola?
(php >= 5)

http://www.php.net/manual/en/language.oop5.reflection.php
Cytat
The ReflectionFunction class lets you reverse-engineer functions.

<?php
class ReflectionFunction implements Reflector
{
  final private __clone()
  public object __construct(string name)
  public string __toString()
  public static string export(string name, bool return)
  public string getName()
  public bool isInternal()
  public bool isUserDefined()
  public string getFileName()
  public int getStartLine()
  public int getEndLine()
  public string getDocComment()
  public array getStaticVariables()
  public mixed invoke(mixed args)
  public mixed invokeArgs(array args)
  public bool returnsReference()
  public ReflectionParameter[] getParameters()
  public int getNumberOfParameters()
  public int getNumberOfRequiredParameters()
}
?>


Cytat
The ReflectionParameter class retrieves information about a function's or method's parameters.

<?php
class ReflectionParameter implements Reflector
{
  final private __clone()
  public object __construct(string name)
  public string __toString()
  public static string export(mixed function, mixed parameter, bool return)
  public string getName()
  public bool isPassedByReference()
  public ReflectionFunction getDeclaringFunction()
  public ReflectionClass getDeclaringClass()
  public ReflectionClass getClass()
  public bool isArray()
  public bool allowsNull()
  public bool isPassedByReference()
  public bool getPosition()
  public bool isOptional()
  public bool isDefaultValueAvailable()
  public mixed getDefaultValue()
}
?>
Bastion
trudno wymagac od programisty aby uzywal "\," ...

dr_boonzo : idealne smile.gif musze sie przyjzec smile.gif
dr_bonzo
Tylko ze to dziala dla przeparsowanych funkcjach a nie na kodzie zrodlowym -- ale wystarczy eval()'nac zrodla i zastosowac refleksje.
Bastion
dr_bonzo : idealne smile.gif dzieki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.