PDA

Просмотр полной версии : Помогите составить регулярное выражение


slesh
02.06.2009, 13:19
Немогу допереть как составить реулятрое выражение под данные таково формата:

$x data1 $x data2 ..... $x dataN
где x - это символы a-z 0-9
строка может содержать переменное кол-во повторов блока $x data
При этом мне необходимо выбрать все x и data
При этом в тексте может встречаться $, по этому парсится должны только в тех местах где $ находится в начале строки или перед ним пробел и в после него - один символ a-z 0-9 а далее пробел.

Пример строки:
$a data1 $g da$ta2 $y data3 $2 data4 $2 data5
на выходе я должен получить массив:
a data1
g da$ta2
y data3
2 data4
2 data5

P.S. Для PHP

159932
02.06.2009, 13:30
<?php
preg_match_all('#\$([a-z0-9]{1,}) ([a-z0-9\$]{1,})#', '$a data1 $g da$ta2 $y data3 $2 data4 $2 data5', $m);
print_r(array_combine($m[1],$m[2]));
?>

m0Hze
02.06.2009, 13:35
<?php
preg_match_all('#(\$[a-z0-9]{1,}) ([a-z0-9\$]{1,})#', '$a data1 $g da$ta2 $y data3 $2 data4 $2 data5', $m);
foreach ($m[1] as $ky=>$va) $m[1][$ky] = substr($m[1][$ky],1);
print_r(array_combine($m[1],$m[2]));
?>
Он же сказал,что в $2 data4 невсегда встречаеться $.Незачод,думаем дальше.Тут нужно |

159932
02.06.2009, 13:40
2 m0Hze

не вникал я там в его условия, голова щас не сильно варит .. он дал пример, я по нему и составил регулярку .. ну а вообще есть для регулярок тема https://forum.antichat.ru/thread92492.html !

попугай
02.06.2009, 13:51
$fp = '$a data1 $g da$ta2 $y data3 $2 data4 $2 data5';

$x = explode(' $', $fp);
foreach($x as $y){

$data .= $y . ':';
}

$data = explode(':', substr($data, 1));
foreach($data as $z){
echo $z . PHP_EOL;
}



Громоздко( и не регулярка

slesh
02.06.2009, 14:09
Всем спс.

krypt3r
02.06.2009, 15:53
Один ассоциативный массив тут не получится заюзать, т. к., судя по примеру, ключи могут повторяться. Тут, наверно, следует использовать два обычных массива - в одном ключи, в другом - значения. Как-то так

<?php
$str = '$a data1 $g da$ta2 $y data3 $2 data4 $2 data5' . "\n";
$str .= '$b data_b $e data$2e $y d$at$a3 $7 da7ta $2 data$2' . "\n";
preg_match_all ('/\$([a-z0-9]) (.+?)(\s|\n)/', $str, $m);
//print_r ($m);
$key = $m[1];
$val = $m[2];
print_r ($key);
print_r ($val);
?>

Тут условие, что строка должна завершаться символом \n:

Array
(
[0] => a
[1] => g
[2] => y
[3] => 2
[4] => 2
[5] => b
[6] => e
[7] => y
[8] => 7
[9] => 2
)
Array
(
[0] => data1
[1] => da$ta2
[2] => data3
[3] => data4
[4] => data5
[5] => data_b
[6] => data$2e
[7] => d$at$a3
[8] => da7ta
[9] => data$2
)

slesh
03.06.2009, 09:39
совершенно забыл указать что data - может содежать еще и пробелы )
так что только у попугая нормально работает )