[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложный preg_match
prozac
Привет.

Не могу победить регулярное выражение которое перестает помещаться у меня в голове... есть строка вида:

1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52

Приходит эта строка из файла в кодировке UTF. Цветом выделены три элемента которые я хочу из этой строки выдернуть. Не представляю как должно выглядеть регулярное выражение для разбиения такой строки на части учитывая что элементы могут быть разделены одним, а могут и несколькими пробелами и при этом в самом элементе могут быть пробелы. Еще и UTF-8 масла в огонь подливает... Помогите разобраться, пожалуйста!

Вот пример того, что я сделал:

1. Выражение - выбирает со всего текста набор строк, содержащий нужные мне элементы (работает нормально)

preg_match("#^\d{4}\s .* (:?[A-Z,\d+,\s,-]{8,17})\s+\d{1,}\.\d\dU?#", $buffer_str)



2. Вот выражение которым пытаюсь вытянуть нужные мне элементы:

#(:?[A-Z,\d,\s ,-]{8,14})s+(\d{1,}\.\d\d)#

пробовал уже и с /iu - не получается.



Спустя 1 час, 15 минут, 8 секунд (24.03.2011 - 22:59) kirik написал(а):
Цитата (prozac @ 24.03.2011 - 13:44)
Помогите разобраться, пожалуйста!

Расскажите что в этой строке что обозначает, или хотя бы какие значения может принимать каждый блок?
Типа так:

1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52
цифры текст+цифры+пробелы цифры цифры цифры+буквы цифры+буквы цифры+точка

Спустя 10 минут, 7 секунд (24.03.2011 - 23:09) Winston написал(а):
Попробуй так:
    $str = "1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52";

preg_match("/^\d{4} ([a-zа-я]+) ([a-zа-я]+) ([0-9a-z]+) ([0-9a-z]+) ([0-9a-z]+) ([0-9a-z]+) ([0-9]+\.[0-9]+)/iu", $str, $mat);

echo $mat[1] . '<br />';
echo $mat[2] . '<br />';
echo $mat[3] . '<br />';
echo $mat[4] . '<br />';
echo $mat[5] . '<br />';
echo $mat[6] . '<br />';
echo $mat[7] . '<br />';

Результат:
Цитата

ПРОМЕЖУТОЧНАЯ
ДЕТАЛЬ
443
845
631A
02X
14.52

Спустя 55 минут, 57 секунд (25.03.2011 - 00:05) prozac написал(а):
Цитата (kirik @ 24.03.2011 - 19:59)
Цитата (prozac @ 24.03.2011 - 13:44)
Помогите разобраться, пожалуйста!

Расскажите что в этой строке что обозначает, или хотя бы какие значения может принимать каждый блок?
Типа так:

1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52
цифры текст+цифры+пробелы цифры цифры цифры+буквы цифры+буквы цифры+точка



1417           ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ               443   845   631A        02X                       14.52
4 цифры кирилица+латиница+пробелы это все один номер (латиница+цифры+пробелы+тире) цифры+точка (цена)

Спустя 2 часа, 10 минут, 36 секунд (25.03.2011 - 02:16) prozac написал(а):
Вот так решил:

/\n\d{4}\s+\d* (\W+) \s \+* ((?:\w{2,}\s){2,}) \s+ (\d+\.\w+) /x

Спустя 1 час, 16 минут, 42 секунды (25.03.2011 - 03:32) kirik написал(а):
prozac
Может так?
$str = '1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52';
// | | |

// 1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52
// 4 цифры кирилица+латиница+пробелы это все один номер (латиница+цифры+пробелы+тире) цифры+точка (цена)

//preg_match("#^\d+\s+([\s\D]+?)([\w\d\s\-]+)(\d+\.\d+)$#iU", $str, $out);
// даже так:

preg_match("#^\d+\s+(\D+?)([\w\d\s\-]+)(\d+\.\d+)$#iU", $str, $out);

print_r($out);
/*
Array
(
[0] => 1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52
[1] => ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ
[2] => 443 845 631A 02X
[3] => 14.52
)
*/

Спустя 8 часов, 2 минуты, 50 секунд (25.03.2011 - 11:35) prozac написал(а):
kirik, работает и так и так. В своем варианте я перекодирую строку в 1251, в Вашем работает и с UTF. Спасибо за подсказку!

Спустя 6 дней, 30 минут, 56 секунд (31.03.2011 - 11:06) Dron19 написал(а):
Если из строки 1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52

Надо получить 1417
то вот код, пишу с компа информатики, денвера нет, так что может не сработать, если так выйдет, то скажите в чем ошибка, я допишу и кину код.


$str = "1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52";
$str = preg_replace("/([0-9+])(.).*/iu", "\\1", $str);
echo $str;

Спустя 10 часов, 40 минут, 12 секунд (31.03.2011 - 21:46) kirik написал(а):
Цитата (Dron19 @ 31.03.2011 - 03:06)
Если из строки 1417 ПРОМЕЖУТОЧНАЯ ДЕТАЛЬ 443 845 631A 02X 14.52

Надо получить 1417

Что нужно получить написано в этом посте, читай тему сначала.
Зачем юзать preg_replace?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.