Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите пожалуйста с регулярным выражением (убрать префиксы)
 
 автор: dalex   (01.03.2013 в 15:05)   письмо автору
 
 

Помогите составить регулярное выражение, с помощью которого можно было бы избавиться от префиксов. Пример строки
OPL OPLMT17522
необходимо привести к виду OPLMT17522, при условии, что префикс может иметь набор из других символов от 2 до 10

  Ответить  
 
 автор: confirm   (01.03.2013 в 21:49)   письмо автору
 
   для: dalex   (01.03.2013 в 15:05)
 

Если это единичное значение, а не часть строки, и другие подобные являются ими же, то нет необходимости в рег. выражениях:
<?
$s 
'OPL OPLMT17522';
$s strpbrk($s' ');

  Ответить  
 
 автор: dalex   (02.03.2013 в 18:31)   письмо автору
 
   для: confirm   (01.03.2013 в 21:49)
 

Спасибо за ответ, но задача - реализовать с помощью регулярного выражения

  Ответить  
 
 автор: confirm   (02.03.2013 в 18:39)   письмо автору
 
   для: dalex   (02.03.2013 в 18:31)
 

Эта задача ради задачи или нужно решение? Я вас спросил - это отдельное строковое значение или нет, и если отдельное, то забудьте о рег. выражениях. Запомните - где можно обойтись без рег. выражений, используя стандартные функции, то используйте их.

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

  Ответить  
 
 автор: dalex   (04.03.2013 в 14:19)   письмо автору
 
   для: confirm   (02.03.2013 в 18:39)
 

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

Спасибо

  Ответить  
 
 автор: Slo_Nik   (04.03.2013 в 16:43)   письмо автору
 
   для: dalex   (04.03.2013 в 14:19)
 

В таком случае, как писалось выше, приводите полностью строку, строки.
Может будет проще прикрепить файл с образцом такста, который надо обработать
И опишите подробней, что именно надо выбрать

пока можно начать со следующего, если я правильно понял

<?php
$str 
"OPL OPLMT17522
        O2L OPLMT17522
        OPL245gFf OPLMT17522
        OPL983LFAAB OPLMT17522
        O-457 OPLMT17522
        OPL_fDf-55 OPLMT17522"
;
$pattern "#(?:\b[-\w]{2,10}\b\s{1})(\w+)#is";
preg_match_all($pattern$str$out);
echo 
"<pre>";
 
print_r($out);
echo 
"</pre>";
?>

  Ответить  
 
 автор: confirm   (04.03.2013 в 19:52)   письмо автору
 
   для: Slo_Nik   (04.03.2013 в 16:43)
 

Если входные данные выглядят именно так, и задача забрать то, что после пробела, то к чему это городить?

  Ответить  
 
 автор: Slo_Nik   (04.03.2013 в 20:09)   письмо автору
 
   для: confirm   (04.03.2013 в 19:52)
 

Я предположил, что они так выглядят, автор вопроса так и не сказал, что как всё это должно выглядеть
единственно, что написал автор вопроса
необходимо привести к виду OPLMT17522, при условии, что префикс может иметь набор из других символов от 2 до 10

Какой Ваш вариант?

  Ответить  
 
 автор: confirm   (04.03.2013 в 20:12)   письмо автору
 
   для: Slo_Nik   (04.03.2013 в 20:09)
 

Если выглядит так как вы предполагаете, то рег. выражений и подавно не надо.

  Ответить  
 
 автор: Slo_Nik   (04.03.2013 в 20:26)   письмо автору
 
   для: confirm   (04.03.2013 в 20:12)
 

это понятно, Вы выше писали, но утверждает, что именно РВ надо, так что подождём автора вопроса, пусть покажет реальный файл, а там будет видно

  Ответить  
 
 автор: dalex   (05.03.2013 в 15:35)   письмо автору
 
   для: Slo_Nik   (04.03.2013 в 20:26)
 

По поводу почему именно РВ
Если вкратце, то:
Перед заливкой данных в БД происходит обработка прайс листа, в данном случае артикула производителя
Из текстового файла берется каждая строка и обрабатывается поле с артикулом, приводя его к нужному виду.
Для каждого производителя существует свой формат артикула
AP107205
10720/0.25
10415 02 и тд
Исходные данные могут иметь вид
AP AP107205 - нужно привести к виду AP107205
10720/0.25=105.1217=14222 - нужно привести к виду 10720/0.25
10415 02(03)/(05) - - нужно привести к виду 10415 02

Так как данные динамические, то для каждого производителя задается свое регулярное выражение, которое и приводит значение к нужному виду

  Ответить  
 
 автор: dalex   (05.03.2013 в 15:14)   письмо автору
 
   для: Slo_Nik   (04.03.2013 в 16:43)
 

Огромное спасибо за помощь!!!!

  Ответить  
 
 автор: confirm   (05.03.2013 в 15:17)   письмо автору
 
   для: dalex   (05.03.2013 в 15:14)
 

По рукам бы за такую помощь, а вам не мешало бы крепко думать, а не собирать мусорный код.

  Ответить  
 
 автор: dalex   (05.03.2013 в 15:36)   письмо автору
 
   для: confirm   (05.03.2013 в 15:17)
 

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

Немножко поспешил, сори
РВ - #(?:\b[-\w]{2,10}\b\s{1})(\w+)#is,
не совсем рабочее
из OPL OPLMT17522 получает все выражение, не отсекая OPL

  Ответить  
 
 автор: confirm   (05.03.2013 в 16:01)   письмо автору
 
   для: dalex   (05.03.2013 в 15:36)
 

Вот что я вам скажу, и в последний раз:
То что вам написали, полнейшая хрень, причем вредная, если текст из которого вы пытаетесь убрать лишнее именно так и выглядит.
Зарубите себе на носу, что рег. выражения, это прожорливое зло, если он применяется без надобности.

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

  Ответить  
 
 автор: dalex   (05.03.2013 в 16:06)   письмо автору
 
   для: confirm   (05.03.2013 в 16:01)
 

Согласен, что можно и мене кровавыми, но нужно унифицировать процесс, пока выход один - РВ
Писать отдельную обработку, для каждого поставщика и каждого производителя нецелесообразно, это пройденный этап

  Ответить  
 
 автор: confirm   (05.03.2013 в 16:19)   письмо автору
 
   для: dalex   (05.03.2013 в 16:06)
 

Не процесс надо унифицировать, а описать все, если вы хотите получать ответ на свои вопросы. Иначе каким образом разбираться с этим:
10720/0.25=105.1217=14222 - нужно привести к виду 10720/0.25
А вы знаете что называется префиксом?

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 16:22)   письмо автору
 
   для: confirm   (05.03.2013 в 16:19)
 

вот поэтому и просил автора прикрепить файл к сообщению, чтобы не заниматься гаданием на кофейной гуще

  Ответить  
 
 автор: confirm   (05.03.2013 в 16:24)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 16:22)
 

А чего же не дождались, а написали какую-то хрень не понятно для чего?

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 16:28)   письмо автору
 
   для: confirm   (05.03.2013 в 16:24)
 

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

  Ответить  
 
 автор: confirm   (05.03.2013 в 16:44)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 16:28)
 

Я написал исключительно к той строке, которая была представлена, и применительно к ней, это самое разумное решение.
Вместо ответа на вопрос чем являются его данные, и подробных пояснений о них, от автора последовали только эмоции. На эмоции я не отвечаю, в отличии от вас. Если бы дело обстояло так, как вы предположили, то то что вы предлагаете, даже и не знаю чем назвать.
По крайней мере, известно, что это строки, а строки, это массив. Уже на этом этапе, что выгоднее - в цикле разобрать строку очищенную от мусора, или же гонять всю строку тем что вы предлагаете?

А возвращаясь к недавнему комментарию автора, особенно строке, которую я выделил" и сути самого вопроса, встает вопрос - это какую же унификацию он желает?

Если вы наряду с автором темы не желаете задумываться прежде чем..., предполагайте, рожайте...

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 16:21)   письмо автору
 
   для: confirm   (05.03.2013 в 16:01)
 

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

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 16:18)   письмо автору
 
   для: dalex   (05.03.2013 в 15:36)
 

правильно, не совсем верное решение
но а где Ваш пример, реальный, кусок файла или весь, если не сильно большой?
Прикрепите к сообщению, чтобы можно было видеть, что и как
<?php
$pattern 
"#(?:\b[-\w]{2,10}\b\s{1})(\w+)#is"// не правильно \s{1}
$pattern "#(?:\b[-\w]{2,10}\b\s)(\w+)#is"// так будет правильней, {1} в данном случае явно лишнее
?>

Короче, давайте файл, так продолжим

  Ответить  
 
 автор: dalex   (05.03.2013 в 17:15)   письмо автору
2 Кб
 
   для: Slo_Nik   (05.03.2013 в 16:18)
 

Вот небольшой пример

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 17:22)   письмо автору
 
   для: dalex   (05.03.2013 в 17:15)
 

ну наконец то)))
теперь точно опишите, что Вам надо получать, какой именно участок строки?

  Ответить  
 
 автор: dalex   (05.03.2013 в 18:00)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 17:22)
 

Строка разбивается на поля

"AE"; - производитель
"AE 20760 STD"; - артикул
"Поршень"; - описание
315.23 - цена
Обрабатывается только содержимое одного поля AE 20760 STD - артикул
С него нужно получить 20760 STD

  Ответить  
 
 автор: dalex   (05.03.2013 в 17:23)   письмо автору
 
   для: dalex   (05.03.2013 в 17:15)
 

Для выражения
AD 55.0237 = 55.237
Хорошо подходит ([^AD ][a-zA-Z0-9\.]+), но если встречается комбинация AD AD55.0237 = 55.237, то
съест AD AD, что есть не верно

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 18:08)   письмо автору
 
   для: dalex   (05.03.2013 в 17:23)
 

Вы действительно не читаете вопросы...
Повторяю, что конкретно Вам надо получить из каждой строки?
"AE";"AE 20760 STD";"Поршень";315.2 - что???
"AE";"AE 21776 1.00MM";"Поршень";339.07 - что???
"Adriauto";"AD 55.0236";"Трос";8.70 - что???
"Adriauto";"AD 55.0242 = 55.242";"Трос";11.34 - что???

в этом случае
AD AD55.0237 = 55.237
<?php
// От 0 до 2 заглавных букв, за которыми идут две цифры, потом сразу "точка", за которой четыре цифры
$pattern "#([A-Z]{0,2}\d{2}\.\d{4})#s";
?>

но это не сработает для остальных, а Вам надо описать все варианты в одном выражении

  Ответить  
 
 автор: dalex   (05.03.2013 в 18:27)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 18:08)
 

1 В цикле Каждую строку разбиваем на поля (К моему вопросу не относится), для ясности
"AE";"AE 20760 STD";"Поршень";315.2
$brand="AE";
$artikul="AE 20760 STD";
$deskr="Поршень";
$price=315.2;
2 обрабатываем значение $artikul="AE 20760 STD";, так что бы $artikul был равен
$artikul="20760 STD"
3 пишем в базу 'insert into table (.....) values ( $brand, $artikul, $deskr,$price)'

Берем другую строку
"Adriauto";"AD 55.0242 = 55.242";"Трос";11.34 , разбиваем на поля
$brand="Adriauto";
$artikul="AD 55.0242 = 55.242";
$deskr="Трос";
$price=11.34;
обрабатываем значение $artikul="AD 55.0242 = 55.242"; приводя к виду
$artikul="55.0242"
пишем в базу
и тд

  Ответить  
 
 автор: dalex   (05.03.2013 в 18:33)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 18:08)
 

>в этом случае
>AD AD55.0237 = 55.237
>
<?php
>// От 0 до 2 заглавных букв, за которыми идут две цифры, потом сразу "точка", за которой четыре цифры
>$pattern "#([A-Z]{0,2}\d{2}\.\d{4})#s";
>
?>

>но это не сработает для остальных, а Вам надо описать все варианты в одном выражении

Я хочу получить универсальное РВ, которое отбросит первую часть до пробела, включая пробел и будет работать для
AE AE135135
AE AEJLKHLHK
BP 532FDFDF/0.25 и тд

Спасибо

  Ответить  
 
 автор: Slo_Nik   (05.03.2013 в 23:53)   письмо автору
 
   для: dalex   (05.03.2013 в 18:33)
 

попробуйте так

<?php
$pattern 
"#\b(?:\s)([A-Z]{0,2}\w+\.?\w+)(?:\s?)#s";

  Ответить  
 
 автор: dalex   (06.03.2013 в 11:16)   письмо автору
 
   для: Slo_Nik   (05.03.2013 в 23:53)
 

Спасибо
Сработало с маленькой корректировкой
$pattern = "\b(?:[^\s])([A-Z]{0,2}\w+\.?\w+)";

  Ответить  
 
 автор: Slo_Nik   (06.03.2013 в 11:35)   письмо автору
 
   для: dalex   (06.03.2013 в 11:16)
 

работало и без корректировки, просто надо было брать элемент массива $out[1]
хотя если так, как Вы написали, то должно ошибку выдавать

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования