Однажды решил сделать TCP/IP-сервер, ...

  • Автор темы Lord Micro
  • Дата начала

Lord Micro

Guest
Однажды решил сделать TCP/IP-сервер, ...

Однажды решил сделать TCP/IP-сервер, все получилось чики-пуки. Но вот встала проблема передачи каких-либо команд(сокетов, назовите как хотите) данному TCP/IP-серверу. Вообщем вопрос встал в каком формате их передавать.
Как человеку, любящему Unix-системы я решил создать формат как в консоли Unix-система(info --user="test" --password="tetet" -s -v -ab).
Вообщем я начал ваять эту штуку...Вот смотрите что вышло...

PHP:
#!/usr/local/bin/php -q
<?php
$test_array = array(
"info",
"info -u root",
'info -u "root"',
"info -u 'root'",
"info --user=root",
'info --user="root"',
"info --user='root'",
"info --user=root",
"info -abc -dez",
"info -a -b -c",
"info --user=root -abc -x -y -u root -z -t 'test' -r \"terstik\" --vot=\"eto\" --vot2='eto2' --tri=\"test\" --cool='test' --ttt=test --tt=test -o -l test1 k"
);

function parse_cm($string)
{
	//$string=trim($string);
	$array=array();
	$string = $string." ";
	$array['all'] = $string;
	preg_match("/^\s*([A-Za-z][A-Za-z0-9]*)\s*(\s.*\s)?\s*$/",$string,$match);
	$array['function'] = $match[1];
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*\"([^\"]+)\"\s?/",$match[2],$match2,PREG_SET_ORDER);	
	$array['a--']=$match2;
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*'([^']+)'\s?/",$match[2],$match3,PREG_SET_ORDER);
	$array['b--']=$match3;
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*([^\s'\"]+)\s?/",$match[2],$match4,PREG_SET_ORDER);
	$array['c--']=$match4;
	
	preg_match_all("/\s-([A-Za-z])\s+([^\s-\"']+)+\s?/",$match[2],$match5,PREG_SET_ORDER);
	$array['a-']=$match5;

	preg_match_all("/\s-([A-Za-z])\s+\"([^\s-\"]+)\"+\s?/",$match[2],$match6,PREG_SET_ORDER);
	$array['b-']=$match6;
	
	preg_match_all("/\s-([A-Za-z])\s+'([^\s-']+)'+\s?/",$match[2],$match7,PREG_SET_ORDER);
	$array['c-']=$match7;
//	-a
	preg_match_all("/\-([A-Za-z]+)\s[^\"']/",$match[2],$match8,PREG_SET_ORDER);
	$array['a']=$match8;
	
	//preg_match_all("/\s-([A-Za-z]{2,})\s*[-|$]?/",$match[2],$match9,PREG_SET_ORDER);
	//preg_match_all("/([A-Za-z])/", join(" ",$match9[0]), $array['b'],PREG_SET_ORDER);
	//echo join(" ",$match9[0]);
	//print_r($match9);
	//preg_match_all("/(-([A-Za-z]{1})*)\s-?/",$match[2],$match5,PREG_SET_ORDER);
	//$array['p0']=$match5;
	return $array;
}

//print_r($test_array);
$new_array = array();
foreach($test_array as $ta)
{
	$new_array[] = parse_cm($ta);
}
print_r($new_array);
//var_dump($new_array);
?>
"a--" - ищет по типу: --user="root" (реализовано)
"b--" - ищет по типу: --user='root' (реализовано)
"c--" - ищет по типу: --user=root (реализовано)

"a-" - ищет по типу: -u "root" (реализовано)
"b-" - ищет по типу: -u 'root' (реализовано)
"c-" - ищет по типу: -u root (реализовано)

"a" - ищет по типу: -a -b (не реализовано)
"b" - ищет по типу: -abc (не реализовано)

Так вот не знаю как быть со следующими двумя. Помогите плиз!
 

nerezus

Вселенский отказник
Для достижения желаемой цели очень важно выбрать правильный инструмент.
ИМХО ты этого сделать не смог...
 

Lord Micro

Guest
Автор оригинала: nerezus
Для достижения желаемой цели очень важно выбрать правильный инструмент.
ИМХО ты этого сделать не смог...
Добрый человек, я выбрал почти оптимальное решение. Может будут другие пожелания? Через что это можно реализовать?

-~{}~ 10.08.05 20:49:

нету ни у кого предложений?

-~{}~ 11.08.05 18:11:

Вообщем сделал что хотел..посмотрите, оцените и скажите что ещё мож доработать или подскажите как оптимизировать...
PHP:
#!/usr/local/bin/php -q
<?php
$test_array = array(
"info",
"info -u root",
'info -u "root"',
"info -u 'root'",
"info --user=root",
'info --user="root"',
"info --user='root'",
"info --user=root",
"info -abc -dez",
"info -a -b -c",
"info --user =root -abc -x -y -u root -z -t 'test' -r \"terstik\" --vot=\"eto\" --vot2='eto2' --tri=\"test\" --cool='test' --ttt=test --tt=test -o -l test16 --help"
);

function parse_cm($string)
{
	$retarray = array();
	$retarray['all'] = $string;
	$string = $string." ";
	preg_match("/^\s*([A-Za-z][A-Za-z0-9]*)\s*(\s.*\s)?\s*$/",$string,$match);
	$retarray['function'] = $match[1];
	$retarray['var'] = array();
	if(strlen(trim($match[2]))==0) return $retarray;
	$a=0;
	
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)[\s+|$]/",$match[2],$match5,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match5);$i++)
	{
		$retarray['var'][$match5[$i][1]] = true;
	}
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*\"([^\"]+)\"[\s+|$]/",$match[2],$match2,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match2);$i++)
	{
		$retarray['var'][$match2[$i][1]] = $match2[$i][2];
	}
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*'([^']+)'[\s+|$]/",$match[2],$match3,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match3);$i++)
	{
		$retarray['var'][$match3[$i][1]] = $match3[$i][2];
	}
	preg_match_all("/\s--([A-Za-z][A-Za-z0-9]*)\s*=\s*([^\s'\"]+)[\s+|$]/",$match[2],$match4,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match4);$i++)
	{
		$retarray['var'][$match4[$i][1]] = $match4[$i][2];
	}
	
	preg_match_all("/\s-([A-Za-z])\s+([^\s-\"']+)[\s+|$]/",$match[2],$match6,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match6);$i++)
	{
		$retarray['var'][$match6[$i][1]] = $match6[$i][2];
	}

	preg_match_all("/\s-([A-Za-z])\s+\"([^\s-\"]+)\"[\s+|$]/",$match[2],$match7,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match7);$i++)
	{
		$retarray['var'][$match7[$i][1]] = $match7[$i][2];
	}
	
	preg_match_all("/\s-([A-Za-z])\s+'([^\s-']+)'[\s+|$]/",$match[2],$match8,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match8);$i++)
	{
		$retarray['var'][$match8[$i][1]] = $match8[$i][2];
	}
	
	preg_match_all("/\-([A-Za-z]+)\s/",$match[2],$match9,PREG_SET_ORDER);
	for($i=0;$i<sizeof($match9);$i++)
	{
		if(!isset($retarray['var'][$match9[$i][1]]))
		{
			if(strlen($match9[$i][1])==1)
			{
				$retarray['var'][$match9[$i][1]] = true;
			}
			else
			{
				preg_match_all("/[A-Za-z]/",$match9[$i][1],$match91);
				for($j=0;$j<sizeof($match91[0]);$j++)
				{
					if(!isset($retarray['var'][$match91[0][$j]])&&strlen($match91[0][$j])==1)
					{
						$retarray['var'][$match91[0][$j]] = true;
					}
				}
			}
		}
	}
	return $retarray;
}

//print_r($test_array);
$new_array = array();
for($i=0;$i<sizeof($test_array);$i++)
{
	$tm = time()+microtime();
	for($j=1;$j<=10000;$j++) $new_array[$i] = parse_cm($test_array[$i]);
	$new_array[$i]['time'] = time()+microtime()-$tm;
}
print_r($new_array);
//var_dump($new_array);
?>
 
Сверху