Эта тема на forum.dklab.ru


Xoce: Разобрать строчку на части
Вот проблема: необходимо разобрать строчку вида "1.2 AB" на 3 состовляющие: "1" "2" "AB".
Причом исходная строчка может быть и такого вила "28.111", т.е. отсудствует " AB", тогда третую состовляющую нужно обозначать как ноль.
Собственно это массив данных, который может меняться от значения к значению.

Как я это пытаюсь решать:

$var = "1.2 AB";
$var2 = explode(".", $var);
$var3 = explode(" ", $var2[1]); // здесь проблемы

Т.к. точка в строку входит всегда, поэтому с выделением первой состовляющей у меня проблем не возникает.
Проблемы возникают когда я хочу получить вторую и третую состовляющую... Из-за того что разделителя может не быть то правильно обработать правую часть после точки не получается. Покажите пожалуйста возможное решение моей проблемы?
_
7.3.:
function justdoit($str = '1.2 AB')
{
preg_match('#([0-9]+)\.([0-9]+)\s?(.*?)#i',$str,$m);
return array($m[1],$m[2],$m[3]);
}

Так не пойдет?
WingedFox:

$res = preg_split("/[.\s]/",$var);

Xoce:
К сожалению не пойдет, потому, что $m[3] не определена...
_
Xoce:
WingedFox:
Спасибо! Огромное! Я знаю где живут боги! :)

Подскажите пожалуйста ссылки на хорошие материалы про регулярные выражение для php?
_
WingedFox:
Xoce:
Пожалуйста 8*)

Очень советую "Регулярные выражения" Фридла, 2 выпуск и мануал http://ru2.php.net/manual/ru/ref.pcre.php
Особенно полезны пользовательские коментарии к функциям.
7.3.:
К сожалению не пойдет, потому, что $m[3] не определена...
Никакой разницы. :) Второй вариант такой же. Хотя и короче.
WingedFox:
7.3.:
И работает быстрее 8*)
Xoce:
7.3.:
Ваш вариан, похож на то как я неправильно пытался действовать в первом посте. К сожалению, разница оказалась существенной, т.к. ни Ваш, ни мой варианты не работали...

У меня появился новый вопрос. Я прошел самый сложный участок с Вашей помощью, но всегда что-нибудь не поподает под общую гребенку :)
Вобщем вопрос такой.
Я анализирую текстовые строки примерно такого вида:

На каком расстоянии до скользкого участка дороги устанавливается этот знак в населенном пункте?
150-300 м.
50-100 м.
Непосредственно перед началом скользкого участка.

4.2

Смысл -- получить массив вот такого вида

Array
(
[4.2] => Array
(
[0] => На каком расстоянии до скользкого участка дороги устанавливается этот знак в населенном пункте?
[1] => 150-300 м.
[2] => 50-100 м.
[3] => Непосредственно перед началом скользкого участка.
)
)


Как я решаю


foreach ($lines as $line)
{
$line = trim($line);
$arrline[] = $line;
# Если сторочка это тип флоат, то
$type = $line +1-1;

if($type)
{
$arr[$line] = FSort($arrline); // функция сортировки, где таже проблема, т.е. она не в счет
$arrline = array();
}
}


Вобщем у уменя получается вот такая вот фигня в результате, вместо того что нужно

Array
(
[150-300 м.] => Array
(
[0] => На каком расстоянии до неровного участка дороги устанавливается этот знак вне населенного пункта?
[1] => 150-300 м.
)

[50-100 м.] => Array
(
[0] => 50-100 м.
)

[4.2] => Array
(
[0] => Непосредственно перед началом скользкого участка.
[1] => 4.2
)
)


Это происходит потому, что переменная "150-300 м." дает результат не 0, когда я ее пытаюсь вычислить вот так $type = $line +1-1;

Вобщем, если вам было бы не сложно разобраться в том, что я тут понаписал, то может Вы смогли бы подсказать иное решение моей задачи?

Иначе без ручной проверки всего этого барахла мне не обойтись :)
К слову, в массиве у меня где-то 7500 записей и ошибка возникает раз 30-40 не более - на кройняк справлюсь в ручную.
_
WingedFox:
Xoce:
Какое общее правило формирования для каждой из карточек?
В каком формате они поступают?
Xoce:
Какое общее правило формирования для каждой из карточек?
Смысл это получить один большой многомерный массив, который я потом выведу как надо, чтобы сформировать собственную БД.

Array
(
[4.2] => Array
(
[0] => На каком расстоянии до скользкого участка дороги устанавливается этот знак в населенном пункте?
[1] => 150-300 м.
[2] => 50-100 м.
[3] => Непосредственно перед началом скользкого участка.
)
)


Это есть просто текстовой файл, который я читаю с помощью
$lines = file ('http://www.karasev.ru/ttt.txt');

Вот как в этом файле находятся записи(пивожу копи/пастом выборочно):
------------------------------------------------------------------------------------------------------------
Тема 1: Общие положения
Являются ли тротуары и обочины частью дороги?
Являются.
Являются только обочины.
Не являются.

1.1



На каком рисунке изображена дорога с разделительной полосой?
Только на левом.
Только на правом.
На обоих.

1.2



На каком расстоянии до скользкого участка дороги устанавливается этот знак в населенном пункте?
150-300 м.
50-100 м.
Непосредственно перед началом скользкого участка.

4.2



На каком расстоянии до неровного участка дороги устанавливается этот знак вне населенного пункта?
150-300 м.
50-100 м.
Непосредственно перед неровным участком дороги.

4.3
------------------------------------------------------------------------------------------------------------

_
Дмитрий Котеров:
ссылки на хорошие материалы про регулярные выражение для php
http://php.net
там есть раздел с документацией, и его глава про регулярные выражения переведена на русский.
Xoce:
Дмитрий Котеров:
Спасибо мне уже показали верный путь в этом направлении. На выходных буду учиться, учиться, учиться... :)
_
WingedFox:
Xoce:
preg_split("#(\d+\.\d+)#",$var,-1,PREG_SPLIT_DELIM_CAPTURE)
Дальше - сам.
Anonymous:
Есть ли регулярное выражене, которое соответствовало бы заданному литералу и проверяло что перед ним нет обратного слеша?

Эта тема на forum.dklab.ru