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
Форумы портала PHP.SU :: Версия для печати :: Помогите с условием в regex
Форумы портала PHP.SU » » Вопросы новичков » Помогите с условием в regex

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

1. lortine - 27 Августа, 2015 - 14:29:36 - перейти к сообщению
Нужно достать последнее(большее) значение, если таковое имеется из габаритов

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

т.е. на выходе должно получится 140 16 1711
2. andrewkard - 27 Августа, 2015 - 15:32:23 - перейти к сообщению
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.  
3. Sail - 27 Августа, 2015 - 15:35:29 - перейти к сообщению
andrewkard, функция str_replace() для множества искомых значений предусматривает использование массива...
(Добавление)
Чуть подробнее:
Спойлер (Отобразить)
4. lortine - 27 Августа, 2015 - 15:38:36 - перейти к сообщению
Спасибо, а подскажете если нужно вытащить только регулярным выражением в активной группе?
Напр. (\d+[,.]?\d+)\sx\s(\d+[,.]?\d+)\sx\s(\d+[,.]?\d+) описывает только первые цифры и сгодилось бы для точных шаблонных параметров 1 x 2 x 3, а нужно условие аля "если в начале есть число то берем число второе(следующее за ним) за ним.
Для тест можна использовать https://regex101[dot]com/

PS.
С синтаксисом дружу пока очень плохо соотв. поэтому и прошу помощи
5. andrewkard - 27 Августа, 2015 - 15:47:52 - перейти к сообщению
lortine пишет:
нужно условие аля "если в начале есть число то берем число второе(следующее за ним) за ним.

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

Sail
Да спасибо, забыл об этом. Хотя для двух значений вроде и так не плохо Улыбка
6. lortine - 27 Августа, 2015 - 15:54:08 - перейти к сообщению
Числа допустимые для габаритов в условии могут быть любые адекватные
7. andrewkard - 27 Августа, 2015 - 16:15:25 - перейти к сообщению
lortine
Там же и писал изначально:

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

с флагом g

https://regex101[dot]com/r/gZ2eL5/1
8. lortine - 27 Августа, 2015 - 18:18:04 - перейти к сообщению
пропустил, спасибо.
Но если есть возможность нужно более универсальное:
чтобы подходило под любые условия (извините что выразился в пред. посте не точно) т.е. по сути один 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 :>
9. andrewkard - 27 Августа, 2015 - 18:53:38 - перейти к сообщению
lortine
Регулярным тут сложно. Я думаю проще разбить строку на массив по знаку "х" и в цикле проверять, если есть "-" или "~", вычленить второе и перезаписать.
10. lortine - 27 Августа, 2015 - 19:11:03 - перейти к сообщению
Цитата:
lortine
Регулярным тут сложно. Я думаю проще разбить строку на массив по знаку "х" и в цикле проверять, если есть "-" или "~", вычленить второе и перезаписать.

Понимаю, но задание сделать именно в regex :< Первые 3 и отдельно 4 и 5 описать легко, а вот универсальный вариант мне не дается.
(Добавление)
andrewkard
Можно вот этот разбив на массив в виде кода? разбивку ведь так же можно провести регуляркой
11. andrewkard - 27 Августа, 2015 - 23:57:59 - перейти к сообщению
[b]lortine[/b
Вот вариант более или менее приемлемый:
https://regex101[dot]com/r/yF1oZ0/2
PHP:
скопировать код в буфер обмена
  1.  
  2. /(\d{1,}[\.,\d]*)\s[схcx]/g
  3.  
12. lortine - 28 Августа, 2015 - 01:39:51 - перейти к сообщению
andrewkard
Спасибо огромное, не представляю как реализовать это с помощью (?: ) (как подсказывали)
Примерно такое описание и "творили", но тут до меня дошло, что при заполнении [cx] забыл переключить раскладку.
13. lortine - 28 Августа, 2015 - 08:28:20 - перейти к сообщению
-
14. lortine - 28 Августа, 2015 - 13:22:34 - перейти к сообщению
Может кому пригодится
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+)
15. lortine - 28 Августа, 2015 - 15:30:24 - перейти к сообщению
-

 

Powered by ExBB FM 1.0 RC1