Универсальное регулярное выражение.

asics

Новичок
Универсальное регулярное выражение.

Есть 2 текстовых документа, регулярками нужно взять из каждого
2 дробных числа после цифр "9,2" и "19,2" и записать их в соответствующие ячейки таблиц базы.

документ 1.
9,2,53.2271,17028.5082;19,2,53.2271,17028.5082;

документ 2.
19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;

Мой код:
PHP:
//9,2
preg_match('/[^0-9]9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/',$content,$znak);
print_r($znak);

//19,2
preg_match('/[^0-9]19,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/',$content,$znak1);
print_r($znak1);

Проблема в том, что мой код второй документ обрабатывает отлично, а в первом не забирает значения после "9,2".
Почему он не работает для первого я понимаю, нужно убрать [^0-9] в первой строке кода и заработает для документа1, но в этом случаево втором документе будет забирать значения после "19,2", когда нужно после "9,2".
т.е. для каждого в отдельности написать не проблема, но нужен универсальный.

Можно ли составить универсальный код который будет обрабатывать оба документа корректно?

P.S. То, что мне это нужно не для кражи контнта я объяснил админу в этой теме.
 

asics

Новичок
findnext, знаю о квантификаторах:
'/[^0-9]*9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/
или
'/[^0-9]?9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/

Не работает так как нужно, если ты об этом...
 

findnext

Новичок
[0-9]*9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)

-~{}~ 12.03.09 15:13:

asics вот так должно воркать
 

asics

Новичок
нет, выражение [0-9]*9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)
выбирает участок 19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;
а не нужный 19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;;
 

asics

Новичок
Так, перед "9" у нас или ";" или "начало строки", перед 19 тоже, т.е. должно работать так:

[;|начало строки]9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)

Как обозначить "начало строки"?
Квантификатор "*" не подходит, т.к. он допускает случай когда не обязательно совпадение с содержанием cкобок []
 

asics

Новичок
Автор оригинала: findnext
всё там правильно выбирается
Я сейчас проверил на практике, мне вместо строк начинающихся с "9" выдало:

Array ( [0] => 19,2,53.2271,110599.6082; [1] => 53.2271 [2] => 110599.6082 )
Array ( [0] => 19,1,1809.0415,53491.1617; [1] => 1809.0415 [2] => 53491.1617 )
Array ( [0] => 19,3,2309.9642,4040.57; [1] => 2309.9642 [2] => 4040.57 )
Array ( [0] => 19,20,219.8109,19630.8515; [1] => 219.8109 [2] => 19630.8515 )
 

findnext

Новичок
PHP:
$content = "19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;";
		preg_match_all('/[0-9]*9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/',$content,$znak); 
print_r($znak);
 

asics

Новичок
Забыл добавить, что в некоторых файлах строк начинающихся с "9" нет, и в этом случае не должна выбираться часть 1;9,2,53.2271,110599.6082

-~{}~ 12.03.09 18:02:

Автор оригинала: findnext
PHP:
$content = "19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;";
		preg_match_all('/[0-9]*9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/',$content,$znak); 
print_r($znak);
результат:
Array ( [0] => Array ( [0] => 19,2,53.5471,15558.5082; [1] => 9,2,83.9976,47558.1773; ) [1] => Array ( [0] => 53.5471 [1] => 83.9976 ) [2] => Array ( [0] => 15558.5082 [1] => 47558.1773 ) )

т.е. выбираются 4 значения и после 9 и после 19:

19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;

, а мне нужно выбрать только 2:

19,2,53.5471,15558.5082;9,2,83.9976,47558.1773;
 

findnext

Новичок
asics
так и доставай их обращаясь к ключу массива и делай что хочешь
 

asics

Новичок
не подходит этот вариант, нужен уневерсальный парсер достающий 2 значения, т.к. я пишу автомат, а порядок строк начинающихся с 19 и 9 меняется, придется постоянно руками выбирать их из массива, а значений несколько сотен.

-~{}~ 12.03.09 18:10:

Начало строки каким-нибудь символом обозначается?

[;|начало строки]9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)
 

john.brown

просто кулибин
asics
взять из каждого
2 дробных числа после цифр "9,2" и "19,2"
А тут, оказывается, еще какое то условие есть, брать, или не брать после этих цифирек. Почему тебе в данном случае не нужно после 19,2?
Может вообще без регулярок обойтись? Простыми explode()?
 

asics

Новичок
john.brown, нужны и после 19,2 но не в этом месте, у меня 2 части скрипта одна часть выбирает и записывает числа после 9,2, а другая после 19,2.

dimagolov, это привязка к началу строки, но 9 не всегда стоит в начале, иногда и после ;, поэтому нужна констркуция [;|начало строки], а в квадратных скобках ^ уже не начало строки, а отрицание.
 

john.brown

просто кулибин
asics
И ты хочеш, чтоб эти две части выбирали одной и той же регуляркой, угадывая, каким то образом, в какой именно части она используется? Ну, ну...

Так и не сказал, почему при помощи explode() не хочеш делать - пока тут с регуляркой мучаешся уже 100 раз написал бы :) ИМХО, строка сама на простые решения напрашивается...
 

asics

Новичок
x-yuri,


PHP:
$content2 = "9,2,83.9976,47558.1773;19,2,53.5471,15558.5082;"; 
        preg_match_all('/[^|;]9,2,(\d*\.\d*|\d*),(\d*\.\d*|\d*)\;/',$content2,$znak1);
print_r($znak1);
Результат:

Array ( [0] => Array ( [0] => 19,2,53.5471,15558.5082; ) [1] => Array ( [0] => 53.5471 ) [2] => Array ( [0] => 15558.5082 ) )

т.е. "^" это не начало строки, когда в квадратных скобках, как я и говорил.
 
Сверху