Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 19:31   #1
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию работа со строками

Здравствуйте!
Требуется:
Найти определения функций в исходном коде на языке PHP.
Определения методов классов проигнорировать.

смутно соображая получилось такое

Код:
<?php
$text = "class zelistAPI {
function zeListAPI() {
return __construct();
}
}

function construct() {
      api_server = ZELISTAPI_XMLRPC_SERVER;
   api_version = ZELISTAPI_VERSION;
    error = false;
     error_message = '';}";

checkText($text);	 
function checkText($text){
$pattern = "/(function+)(\s{1,})([-_a-zA-Z0-9)(]+)/i";
preg_match_all($pattern, $text, $matches);
print_r ($matches[0]);
;
						}
?>
Но как отличить функцию от метода, регулярки - не приложу ума как, что еще подскажите, пожалуйста!!!
маГГ85 вне форума Ответить с цитированием
Старый 15.12.2011, 20:34   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от маГГ85 Посмотреть сообщение
Но как отличить функцию от метода, регулярки - не приложу ума как, что еще подскажите, пожалуйста!!!
Вам просто названия всех функций нужно собрать - без кода этих функций?
Andkorol вне форума Ответить с цитированием
Старый 15.12.2011, 20:56   #3
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию

Найти определения функций в исходном коде на языке PHP.
Определения методов классов проигнорировать.
То есть нужно выбрать определения функций а определения методов проигнорировать.
маГГ85 вне форума Ответить с цитированием
Старый 15.12.2011, 20:57   #4
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию

на худой конец если знаешь как отобрать названия функций, не отбирая названия методов, то буду признателен хотя бы за это))
маГГ85 вне форума Ответить с цитированием
Старый 15.12.2011, 21:10   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от маГГ85 Посмотреть сообщение
на худой конец если знаешь как отобрать названия функций, не отбирая названия методов, то буду признателен хотя бы за это))
Теоретически, знаю способ получить имена функций через подключение скрипта с функциями к рабочему скрипту - используя get_defined_functions().

Но ваша задача, скорее всего, больше направлена именно на парсинг текстовой информации - тут кроме построчного перебора кода ничего и не придумаешь...
Andkorol вне форума Ответить с цитированием
Старый 15.12.2011, 21:28   #6
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию

построчный перебор через explode ( string separator, string string [, int limit] )?????!!!!
А как отличить состоит функция в классе или нет???)
маГГ85 вне форума Ответить с цитированием
Старый 15.12.2011, 21:49   #7
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от маГГ85 Посмотреть сообщение
построчный перебор через explode ( string separator, string string [, int limit] )?????!!!!
Нет, алгоритм примерно такой:
- читаем файл построчно в массив, при помощи file().
- проходим по массиву (по строкам файла)
- попалось слово function - получаем имя функции (от слова function до первого знака "{", или до конца строки(если функция оформлена по стандарту K&R)), имя очищаем от пробелов trim.
- далее получаем тело найденной функции, фиксируя по пути встречающиеся внутри функции комбинации кода, заключенные в "{}"(проверяем парность этих скобок), пока не находим закрывающую скобку функции "}" - всё, функция считана.
- если попалось слово class - поступаем практически аналогично, ищем открывающую скобку класса "{", дальше всё проверяем просто на парность скобок "{}"(не ищем function), пока не находим закрывающую скобку класса "}" - всё, класс прошли.
- и так весь файл.
- результаты парсинга заносим в массив.

Вот как-то так можно всё распарсить - ничего сложного, вобщем-то...
Andkorol вне форума Ответить с цитированием
Старый 15.12.2011, 22:01   #8
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Вот как-то так можно всё распарсить - ничего сложного, вобщем-то...
Сейчас буду взрывать остатки своего мозга))) Если они за сегодня остались))))
Спасибо))
маГГ85 вне форума Ответить с цитированием
Старый 16.12.2011, 02:31   #9
маГГ85
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 96
По умолчанию

Мозг взорвался, результата нет.....(

Код:
<?php
$text = "class zelistAPI {
function zeListAPI() {
return __construct();
}
}

function construct() {
      api_server = ZELISTAPI_XMLRPC_SERVER;
   api_version = ZELISTAPI_VERSION;
    error = false;
     error_message = '';}";

checkText($text);	 
function checkText($text){
$out='';
$arr = explode ("\n", $text);
foreach ($arr as $key=>$val){
$out.="$val ";
}
$findmeF = "function";
$findmeC = "class";
$pos1 = strpos($out, $findmeF);
$pos2 = strpos($out, $findmeC);
if ($pos1>$pos2)
{
	$amount = $pos1-$pos2;
	$rest = substr($out, $pos2, $amount);
}
else
{
	$amount = $pos2-$pos1;
	$rest = substr($out, $pos1, $amount);
}
echo "$rest";


}

function isCorrect($source)
{
    for($i = 0; $i < strlen($source); $i++)
    {
        switch ($source[$i]) {
            case "(":
                $stack .= "(";
                break;
            case "{":
                $stack .= "{";
                break;
            case ")":
                if ($stack[strlen($stack) - 1] == "(")
                {
                    $stack = substr($stack, 0, strlen($stack)-1);
                }
                break;
           case "}":
                if ($stack[strlen($stack) - 1] == "{")
                {
                    $stack = substr($stack, 0, strlen($stack)-1);
                }
                break;
        }
 
        echo "symbol = " . $source[$i] . ", stack = $stack<br />";
    }
 
   		if (strlen($stack) == 0)
   		{
        	echo 1;
    	}
  			else 
    		{
        		echo 0;
    		}
}

?>
маГГ85 вне форума Ответить с цитированием
Старый 17.12.2011, 02:15   #10
paska27
Пользователь
 
Регистрация: 25.07.2010
Сообщений: 12
По умолчанию

Если предположить, что на одной линии может быть только одна дикларация ф-ии и на линии с закрывающей скобкой для ф-ии, справа от этой скобки тоже ниче нет. И если не учитывать имена ф-й / переменных типа "someclassSmth", "somefunctionToDoSmth", то можно как-то так:

Код:
<?php
$text = "class zelistAPI {
function zeListAPI(hey) {
if(!hey){
	return;
}else{
// do smth
}
return __construct();
}
}

      function construct() {
      api_server = ZELISTAPI_XMLRPC_SERVER;
   api_version = ZELISTAPI_VERSION;
    error = false;
     error_message = '';}";

	
	$lines = explode("\n",$text);
	
	$funcs = array();
	
	for ($i=0;$i<count($lines);$i++){
		if(($pos=stripos($lines[$i],"function"))!==false){
			preg_match("#\s+(\w+)#i",$lines[$i],$matches,PREG_OFFSET_CAPTURE,$pos+strlen("function"));
			$fname = $matches[1][0];
			$fbodystr = "";
			
			$braces=array("o"=>0,"c"=>0);			
			while($braces["o"]!=$braces["c"] || $braces["o"]==0){
				$p = 0;
				while(($p=strpos($lines[$i],"{",$p))!==false){
					$braces["o"]++;
					$p++;
				}
				
				$p = 0;
				while(($p=strpos($lines[$i],"}",$p))!==false){
					$braces["c"]++;
					$p++;
				}

				$fbodystr .= $lines[$i];				
				$i++;			
			}
			$funcs[]=array("name"=>$fname,"body"=>$fbodystr);
			
		} else if(stripos($lines[$i],"class")!==false){
			$braces=array("o"=>0,"c"=>0);			
			while($braces["o"]!=$braces["c"] || $braces["o"]==0){
				$p = 0;
				while(($p=strpos($lines[$i],"{",$p))!==false){
					$braces["o"]++;
					$p++;
				}
				
				$p = 0;
				while(($p=strpos($lines[$i],"}",$p))!==false){
					$braces["c"]++;
					$p++;
				}
				$i++;			
			}
		}
	}
paska27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строками asyat Помощь студентам 4 10.03.2011 22:35
Работа со строками gufon Общие вопросы Delphi 7 04.03.2011 22:59
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
работа со строками mansp Помощь студентам 0 23.11.2010 21:02
Работа со строками Дырдин Общие вопросы C/C++ 12 24.10.2009 19:47