Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с условием в regex

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lortine
Отправлено: 27 Августа, 2015 - 14:29:36
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




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

100.33-140 x 13,54-16 x 1622 ~ 1711 см

т.е. на выходе должно получится 140 16 1711

(Отредактировано автором: 28 Августа, 2015 - 02:02:04)

 
 Top
andrewkard
Отправлено: 27 Августа, 2015 - 15:32:23
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




lortine
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'габариты 100.33-140 x 13,54-16 x 1622 ~ 1711 см';
  3. $arr = array();
  4. preg_match_all("/\-\d{2,3}|~\s\d{1,}/", $str, $matches);
  5. foreach ($matches as $id=>$value){
  6.     $arr[$id] = str_replace('-','',str_replace('~','',$value));
  7. }
  8. echo '<pre>';
  9. print_r($arr);
  10.  
 
 Top
Sail
Отправлено: 27 Августа, 2015 - 15:35:29
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




andrewkard, функция str_replace() для множества искомых значений предусматривает использование массива...
(Добавление)
Чуть подробнее:
Спойлер (Отобразить)
 
 Top
lortine
Отправлено: 27 Августа, 2015 - 15:38:36
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Спасибо, а подскажете если нужно вытащить только регулярным выражением в активной группе?
Напр. (\d+[,.]?\d+)\sx\s(\d+[,.]?\d+)\sx\s(\d+[,.]?\d+) описывает только первые цифры и сгодилось бы для точных шаблонных параметров 1 x 2 x 3, а нужно условие аля "если в начале есть число то берем число второе(следующее за ним) за ним.
Для тест можна использовать https://regex101[dot]com/

PS.
С синтаксисом дружу пока очень плохо соотв. поэтому и прошу помощи

(Отредактировано автором: 27 Августа, 2015 - 15:45:36)

 
 Top
andrewkard
Отправлено: 27 Августа, 2015 - 15:47:52
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




lortine пишет:
нужно условие аля "если в начале есть число то берем число второе(следующее за ним) за ним.

Нужно все числа? Можете точнее и результат необходимый приложить.

Sail
Да спасибо, забыл об этом. Хотя для двух значений вроде и так не плохо Улыбка
 
 Top
lortine
Отправлено: 27 Августа, 2015 - 15:54:08
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Числа допустимые для габаритов в условии могут быть любые адекватные

(Отредактировано автором: 28 Августа, 2015 - 20:05:44)

 
 Top
andrewkard
Отправлено: 27 Августа, 2015 - 16:15:25
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




lortine
Там же и писал изначально:

\-(\d{2,3})|~\s(\d{1,})

с флагом g

https://regex101[dot]com/r/gZ2eL5/1
 
 Top
lortine
Отправлено: 27 Августа, 2015 - 18:18:04
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




пропустил, спасибо.
Но если есть возможность нужно более универсальное:
чтобы подходило под любые условия (извините что выразился в пред. посте не точно) т.е. по сути один regex должен вытаскивать 3 числа активной функцией из любой из этих последовательностей и если указано 2 числа выбирать большее т.е. второе:

111.33 x 15,72 x 1633 см
111,33 x 15.72 x 16,33 см
11133 x 1572 x 16.33 см
111.33 х 15,72 х 1572 ~ 1630 см
111.33-134 x 15,72-16 x 1572 ~ 1630 см

Предполагаю, что делается через (?: ), но описать условия выбора под требования не получается, мне куда проще работать с if/then/else :>

(Отредактировано автором: 27 Августа, 2015 - 18:31:41)

 
 Top
andrewkard
Отправлено: 27 Августа, 2015 - 18:53:38
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




lortine
Регулярным тут сложно. Я думаю проще разбить строку на массив по знаку "х" и в цикле проверять, если есть "-" или "~", вычленить второе и перезаписать.
 
 Top
lortine
Отправлено: 27 Августа, 2015 - 19:11:03
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Цитата:
lortine
Регулярным тут сложно. Я думаю проще разбить строку на массив по знаку "х" и в цикле проверять, если есть "-" или "~", вычленить второе и перезаписать.

Понимаю, но задание сделать именно в regex :< Первые 3 и отдельно 4 и 5 описать легко, а вот универсальный вариант мне не дается.
(Добавление)
andrewkard
Можно вот этот разбив на массив в виде кода? разбивку ведь так же можно провести регуляркой

(Отредактировано автором: 27 Августа, 2015 - 19:20:46)

 
 Top
andrewkard
Отправлено: 27 Августа, 2015 - 23:57:59
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




[b]lortine[/b
Вот вариант более или менее приемлемый:
https://regex101[dot]com/r/yF1oZ0/2
PHP:
скопировать код в буфер обмена
  1.  
  2. /(\d{1,}[\.,\d]*)\s[схcx]/g
  3.  

(Отредактировано автором: 28 Августа, 2015 - 00:07:25)

 
 Top
lortine
Отправлено: 28 Августа, 2015 - 01:39:51
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




andrewkard
Спасибо огромное, не представляю как реализовать это с помощью (?: ) (как подсказывали)
Примерно такое описание и "творили", но тут до меня дошло, что при заполнении [cx] забыл переключить раскладку.

(Отредактировано автором: 28 Августа, 2015 - 02:00:43)

 
 Top
lortine
Отправлено: 28 Августа, 2015 - 08:28:20
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




-

(Отредактировано автором: 28 Августа, 2015 - 20:03:57)

 
 Top
lortine
Отправлено: 28 Августа, 2015 - 13:22:34
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Может кому пригодится
PHP:
скопировать код в буфер обмена
  1. (?:(?:\d+(?:[.,]?\d+)?)\s*[-~])\s*(\d+[.,]?\d+)\s[]\s(?:(?:\d+(?:[.,]?\d+)?)\s*[-~])\s*(\d+[.,]?\d+)\s[]\s(?:(?:\d+(?:[.,]?\d+)?)\s*[-~])\s*(\d+[.,]?\d+)
  2. (?:(?:\d+[,.]\d+|\d+)\s*[-~]\s*)?(\d+[,.]\d+|\d+)\s*[]\s*(?:(?:\d+[,.]\d+|\d+)\s*[-~]\s*)?(\d+[,.]\d+|\d+)\s*[]\s*(?:(?:\d+[,.]\d+|\d+)\s*[-~]\s*)?(\d+[,.]\d+|\d+)

(Отредактировано автором: 28 Августа, 2015 - 19:59:05)

 
 Top
lortine
Отправлено: 28 Августа, 2015 - 15:30:24
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




-

(Отредактировано автором: 28 Августа, 2015 - 19:58:34)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB