Регулярное выражение

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Spiker
Сообщения: 44
Зарегистрирован: 2013.12.15, 20:56

Регулярное выражение

Сообщение Spiker »

Здравствуйте! Помогите разобраться с регуляркой, не могу никак придумать что писать.

есть строка ' Цена: 12р цена 10р Цена:9 абвстр123 '
Нужно получить 12 10 9.

пишу следующее выражение (?<=[Цц]ена[: ]*)\d{1,}, но ничего не выполняется. Если же так написать (?<=[Цц]ена)\d{1,}, и ввести в строку соответствующую запись (Цена123), то все получается. Получается в такую конструкцию (?<= ) нельзя вставлять это [: ]* Пробовал заменить на :? ? , но тоже ничего не вышло. По отдельности обе конструкции выполняются.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Регулярное выражение

Сообщение mickgeek »

Код: Выделить всё

/(Цена|цена)+[:\s]+(\d+)/ 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Регулярное выражение

Сообщение samdark »

Код: Выделить всё

/цена[:\s]+(\d+)/i 
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Регулярное выражение

Сообщение mickgeek »

Sam Dark писал(а):

Код: Выделить всё

/цена[:\s]+(\d+)/i 
Найдёт лишь "цена 10". А плюсик и вправду лишний я поставил :)

Касаемо вывода строки "12 10 9":

Код: Выделить всё

$pattern = '/(Цена|цена)[:\s]+(\d+)/';
preg_match_all($pattern, 'Цена: 12р цена 10р Цена:9 абвстр123', $matches);
$out = implode(',', $matches[0]);

echo preg_replace('/\D+/', ' ', $out);
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Регулярное выражение

Сообщение samdark »

Да, действительно. Я забыл юникод:

Код: Выделить всё

/цена[:\s]+(\d+)/iu 
Вот так найдёт всё что нужно.
Аватара пользователя
Spiker
Сообщения: 44
Зарегистрирован: 2013.12.15, 20:56

Re: Регулярное выражение

Сообщение Spiker »

Код: Выделить всё

/цена[:\s]+(\d+)/iu
Это выражение находит все со словом цена. Про предложение сделать в 2 этапа я уже думал, но задумка в том, чтобы каждой характеристике товара можно было задавать регулярку для ее парсинга и за один обход все собрать. В доках всех больше подходит (?<= ), но не работает почему то со вставленным указанием количества символов.

Подсмотрев немного ваш код, сделал свое кривое решение.

Код: Выделить всё

(?<=[Цц]ена(:| ))\d+|(?<=[Цц]ена(: ))\d+ 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Регулярное выражение

Сообщение samdark »

Ну, задачу моя регулярка решает:
есть строка ' Цена: 12р цена 10р Цена:9 абвстр123 '
Нужно получить 12 10 9.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Регулярное выражение

Сообщение solo »

Ломал голову в чем же смысл в использовании утверждения в данном примере. Но после слов
Это выражение находит все со словом цена.
ко мне пришло озарение :D

preg_match_all('/цена[:\s]+(\d+)/iu', ' Цена: 12р цена 10р Цена:9 абвстр123 ', $matches);
var_dump($matches[1]);
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Регулярное выражение

Сообщение samdark »

Не, ну естественно. Я думал смысл круглых скобочек известен :)
Ответить