ФорумПрограммированиеPHP для идиотов → Хочу: реулярку для добывания обращений к функциям

Хочу: реулярку для добывания обращений к функциям

  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 13:26

    Нужна ваша помощь:
    Есть строка в которой выражение PHP. В ней может быть всё, что угодно, в т.ч. строки. Требуется найти все вызовы функций. Не надо получать параметры вызова, достаточно имен функций. Если в один вызов не получится, давайте не в один :)

    Спасибо!
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 13:48, спустя 21 минуту 47 секунд

    Any valid PHP code may appear inside a function, even other functions and class definitions.

    Function names follow the same rules as other labels in PHP. A valid function name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
    Спустя 22 сек.
    к этому я бы добавил \s*\(

    и все :)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 13:53, спустя 5 минут 7 секунд

    нюню. из разбора требуется исключить содержимое строк.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 14:16, спустя 22 минуты 22 секунды


    нюню. из разбора требуется исключить содержимое строк.
    тогда очевидно тчо не регуляркой надо делать а именно синтаксический разбор
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 29 марта 2010 г. 22:00, спустя 7 часов 44 минуты 24 секунды

    <?php

    function parse($input)
    {
    // удаляем все эскейп последовательности
    $input = preg_replace('/\\./s', '', $input);
    // удаляем строки в одинарных и двойных кавычках
    $input = preg_replace('/\'[^\']+\'/s', '', $input);
    $input = preg_replace('/\"[^\"]+\"/s', '', $input);

    // выделяем вызов функций в строке
    $answ = array();
    if (preg_match_all('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)\s*\(/s', $input, $pockets))
    {
    for ($i = 0; $i < count($pockets[1]); $i++)
    {
    $answ[] = $pockets[1][$i];
    }
    }
    return $answ;
    }

    $str = '$a = func1 ("oeee", \'oeee()\');
    $b = "oeee" + func2();
    $c = "\" ksdljflsdjf \" sdkljfsdkljf \\\' klsdjfl(sdfsdf, \"sdfds\")";
    $d = Test::factory();
    $e = recur(recur(recur()));';
    var_dump(parse($str));

    /* Result:
    array(6) {
    [0]=>
    string(5) "func1"
    [1]=>
    string(5) "func2"
    [2]=>
    string(7) "factory"
    [3]=>
    string(5) "recur"
    [4]=>
    string(5) "recur"
    [5]=>
    string(5) "recur"
    } */

    В принципе работает, но не определяет объявелние функции, класс статичного метода, объект, метод которого вызывается и тп
    Спустя 87 сек.
    а ну да, и кавычки в строке должны быть расставлены верно, иначе работаь не будет )
    Work, buy, consume, die
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 22:04, спустя 4 минуты 19 секунд

    Naaayh, поставь свой умывальник вместо аватарки, все крутые перцы ебел не скрывают))
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 29 марта 2010 г. 22:20, спустя 15 минут 52 секунды

    йа скрываюсь!
    Work, buy, consume, die
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 22:24, спустя 3 минуты 35 секунд


    йа скрываюсь!
    сейчас на тебя заклятие сокрытия наложу - бан =))
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 29 марта 2010 г. 22:51, спустя 27 минут 41 секунду

    Naaayh, да, покажи личико.
    (дуд моё хлебало видел, если чо)
    ιιlllιlllι унц-унц
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 30 марта 2010 г. 0:55, спустя 2 часа 3 минуты 36 секунд

    да ёмана, что за домогательства, я анонимус, у меня нет лица!
    Work, buy, consume, die
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 30 марта 2010 г. 7:07, спустя 6 часов 11 минут 44 секунды

    давай анонимус раскройся
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 30 марта 2010 г. 11:17, спустя 4 часа 9 минут 47 секунд

  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 31 марта 2010 г. 3:00, спустя 15 часов 43 минуты 33 секунды


    token_get_all()
    это что новый вид рефлексии?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 31 марта 2010 г. 6:38, спустя 3 часа 37 минут 32 секунды

    Да нет, это старый способ разбиения php-кода на токены )
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 31 марта 2010 г. 6:52, спустя 14 минут 14 секунд

    Ебт, какой только хни в пхп нету …

Пожалуйста, авторизуйтесь, чтобы написать комментарий!