|
|
|
| Помогите составить регулярное выражение, с помощью которого можно было бы избавиться от префиксов. Пример строки
OPL OPLMT17522
необходимо привести к виду OPLMT17522, при условии, что префикс может иметь набор из других символов от 2 до 10 | |
|
|
|
|
|
|
|
для: dalex
(01.03.2013 в 15:05)
| | Если это единичное значение, а не часть строки, и другие подобные являются ими же, то нет необходимости в рег. выражениях:
<?
$s = 'OPL OPLMT17522';
$s = strpbrk($s, ' ');
|
| |
|
|
|
|
|
|
|
для: confirm
(01.03.2013 в 21:49)
| | Спасибо за ответ, но задача - реализовать с помощью регулярного выражения | |
|
|
|
|
|
|
|
для: dalex
(02.03.2013 в 18:31)
| | Эта задача ради задачи или нужно решение? Я вас спросил - это отдельное строковое значение или нет, и если отдельное, то забудьте о рег. выражениях. Запомните - где можно обойтись без рег. выражений, используя стандартные функции, то используйте их.
И так вам решение именно на рег. выражениях нужно потому, что вам так хочется?
Или эта запись не отдельная строка, а потому рег. выражения нужно? Если второе, то описывайте всю строку, чтобы можно видеть "условия". Если первое, то смотрите ответ выше. | |
|
|
|
|
|
|
|
для: confirm
(02.03.2013 в 18:39)
| | Нет, это не отдельное строковое значение
Решение в виде регулярного выражения необходимо из-за того, что это часть модуля обработки прайс листов, а именно очистка артикулов от мусора, префиксов и т,д. Данные динамические, для каждой группы артикулов нужна своя обработка, простейшее решение, это регулярное выражение, но столкнулся с проблемой, что не хватает моих знаний написать требуемое регулярное выражение
Спасибо | |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(04.03.2013 в 16:43)
| | Если входные данные выглядят именно так, и задача забрать то, что после пробела, то к чему это городить? | |
|
|
|
|
|
|
|
для: confirm
(04.03.2013 в 19:52)
| | Я предположил, что они так выглядят, автор вопроса так и не сказал, что как всё это должно выглядеть
единственно, что написал автор вопроса
необходимо привести к виду OPLMT17522, при условии, что префикс может иметь набор из других символов от 2 до 10
|
Какой Ваш вариант? | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.03.2013 в 20:09)
| | Если выглядит так как вы предполагаете, то рег. выражений и подавно не надо. | |
|
|
|
|
|
|
|
для: confirm
(04.03.2013 в 20:12)
| | это понятно, Вы выше писали, но утверждает, что именно РВ надо, так что подождём автора вопроса, пусть покажет реальный файл, а там будет видно | |
|
|
|
|
|
|
|
для: 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
Так как данные динамические, то для каждого производителя задается свое регулярное выражение, которое и приводит значение к нужному виду | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.03.2013 в 16:43)
| | Огромное спасибо за помощь!!!! | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 15:14)
| | По рукам бы за такую помощь, а вам не мешало бы крепко думать, а не собирать мусорный код. | |
|
|
|
|
|
|
|
для: confirm
(05.03.2013 в 15:17)
| | Не в коде дело, а в правильном регулярном выражении, которое работает, за что огромное спасибо
Немножко поспешил, сори
РВ - #(?:\b[-\w]{2,10}\b\s{1})(\w+)#is,
не совсем рабочее
из OPL OPLMT17522 получает все выражение, не отсекая OPL | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 15:36)
| | Вот что я вам скажу, и в последний раз:
То что вам написали, полнейшая хрень, причем вредная, если текст из которого вы пытаетесь убрать лишнее именно так и выглядит.
Зарубите себе на носу, что рег. выражения, это прожорливое зло, если он применяется без надобности.
Я бы даже не удивился, ели бы оказалось на поверку, что текст который вы вообще разбираете, якобы прайс, можно разобрать куда менее кровавыми методами. | |
|
|
|
|
|
|
|
для: confirm
(05.03.2013 в 16:01)
| | Согласен, что можно и мене кровавыми, но нужно унифицировать процесс, пока выход один - РВ
Писать отдельную обработку, для каждого поставщика и каждого производителя нецелесообразно, это пройденный этап | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 16:06)
| | Не процесс надо унифицировать, а описать все, если вы хотите получать ответ на свои вопросы. Иначе каким образом разбираться с этим:
10720/0.25=105.1217=14222 - нужно привести к виду 10720/0.25
А вы знаете что называется префиксом? | |
|
|
|
|
|
|
|
для: confirm
(05.03.2013 в 16:19)
| | вот поэтому и просил автора прикрепить файл к сообщению, чтобы не заниматься гаданием на кофейной гуще | |
|
|
|
|
|
|
|
для: Slo_Nik
(05.03.2013 в 16:22)
| | А чего же не дождались, а написали какую-то хрень не понятно для чего? | |
|
|
|
|
|
|
|
для: confirm
(05.03.2013 в 16:24)
| | тоже самое могу и Вам сказать, Ваше решение со строковой функцией тоже не единственный вариант
так что давайте прекращать выяснять отношения, а подождём когда автор рассекретит содержание файла))) | |
|
|
|
|
|
|
|
для: Slo_Nik
(05.03.2013 в 16:28)
| | Я написал исключительно к той строке, которая была представлена, и применительно к ней, это самое разумное решение.
Вместо ответа на вопрос чем являются его данные, и подробных пояснений о них, от автора последовали только эмоции. На эмоции я не отвечаю, в отличии от вас. Если бы дело обстояло так, как вы предположили, то то что вы предлагаете, даже и не знаю чем назвать.
По крайней мере, известно, что это строки, а строки, это массив. Уже на этом этапе, что выгоднее - в цикле разобрать строку очищенную от мусора, или же гонять всю строку тем что вы предлагаете?
А возвращаясь к недавнему комментарию автора, особенно строке, которую я выделил" и сути самого вопроса, встает вопрос - это какую же унификацию он желает?
Если вы наряду с автором темы не желаете задумываться прежде чем..., предполагайте, рожайте... | |
|
|
|
|
|
|
|
для: confirm
(05.03.2013 в 16:01)
| | не видя оригинала, что можно ещё написать? я же писал, что это только предположение
для того, как я предположил, можно ещё пару регулярок написать и всё будет работать
согласен, немного запутался, то, что написал не очень правильное выражение
По поводу применения регулярных Вы правы, но опять же, Вы не видели оригинала, поэтому Ваше решение пока тоже предположение | |
|
|
|
|
|
|
|
для: 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} в данном случае явно лишнее
?>
|
Короче, давайте файл, так продолжим | |
|
|
|
|
 2 Кб |
|
|
для: Slo_Nik
(05.03.2013 в 16:18)
| | Вот небольшой пример | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 17:15)
| | ну наконец то)))
теперь точно опишите, что Вам надо получать, какой именно участок строки? | |
|
|
|
|
|
|
|
для: Slo_Nik
(05.03.2013 в 17:22)
| | Строка разбивается на поля
"AE"; - производитель
"AE 20760 STD"; - артикул
"Поршень"; - описание
315.23 - цена
Обрабатывается только содержимое одного поля AE 20760 STD - артикул
С него нужно получить 20760 STD | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 17:15)
| | Для выражения
AD 55.0237 = 55.237
Хорошо подходит ([^AD ][a-zA-Z0-9\.]+), но если встречается комбинация AD AD55.0237 = 55.237, то
съест AD AD, что есть не верно | |
|
|
|
|
|
|
|
для: 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";
?>
|
но это не сработает для остальных, а Вам надо описать все варианты в одном выражении | |
|
|
|
|
|
|
|
для: 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"
пишем в базу
и тд | |
|
|
|
|
|
|
|
для: 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 и тд
Спасибо | |
|
|
|
|
|
|
|
для: dalex
(05.03.2013 в 18:33)
| | попробуйте так
<?php
$pattern = "#\b(?:\s)([A-Z]{0,2}\w+\.?\w+)(?:\s?)#s";
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(05.03.2013 в 23:53)
| | Спасибо
Сработало с маленькой корректировкой
$pattern = "\b(?:[^\s])([A-Z]{0,2}\w+\.?\w+)";
|
| |
|
|
|
|
|
|
|
для: dalex
(06.03.2013 в 11:16)
| | работало и без корректировки, просто надо было брать элемент массива $out[1]
хотя если так, как Вы написали, то должно ошибку выдавать | |
|
|
|