Список ID. Помощь с регуляркой.

I
На сайте с 28.03.2011
Offline
32
390

Здравствуйте!

У меня есть список таких строк:

id:1111111111,first_name:Misha,last_name:Razlivakhin,sex:2,bdate:19.4
id:1111111111,first_name:Степан,last_name:Семёнов,sex:2,bdate:22.1.1990
id:1111111111,first_name:Леха,last_name:Краснов,sex:2,bdate:27.3.1991
id:1111111111,first_name:Владислав,last_name:Ермаков,sex:2,bdate:21.11.1991
id:1111111111,first_name:Владимир,last_name:Смолянинов,sex:2,bdate:6.3,hidden:1
id:1111111111,first_name:Алексей,last_name:Победоносцев,sex:2,bdate:12.7.1990,hidden:1
id:1111111111,first_name:Алексей,last_name:Кифлюк,sex:2,bdate:31.12.1994,hidden:1
id:1111111111,first_name:Руслан,last_name:Чубаков,sex:2,bdate:26.6.1988

id:000000000,first_name:Сергей,last_name:Журавлев,deactivated:deleted,sex:2
id:000000000,first_name:Денис,last_name:Коптев,sex:2,bdate:3.7.1984
id:000000000,first_name:Антон,last_name:Коптев,sex:2,bdate:3.7.1980
id:000000000,first_name:Анна,last_name:Севастьянова,sex:1,bdate:31.12.1994,hidden:1
id:000000000,first_name:Василиса,last_name:Олина,sex:1,bdate:26.6.1988
id:000000000,first_name:Донна,last_name:Романова,sex:1,bdate:3.7.1984

Мне необходимо взять из этого списка регуляркой строки содержащие:

1. "sex:2"

2. И дату рождения такого плана: если указан год, то берем строку только в том случае, если это 1985-1997. Если год не указан - тоже берем. Все отстальное отбрасываем.

У меня получилась такая регулярка:

[0-9]{1,40},first_name:.*,last_name:.[^,]*,sex:2,bdate:[0-9]{1,2}\.[0-9]{1,2}(\.(1985|1986|1987|1988|1989|1990|1991|1992|1993|1994|1995|1996|1997))?

Она работает почти правильно. Захватывает лишние 2 строки с годами 1984 и 1980.

Я так понимаю, что после bdate:[0-9]{1,2}\.[0-9]{1,2} нужно сделать условие, что если есть точка -> проверяем год -> если все ок, то берем. Если нет точки -> то просто берем. Но у меня что-то не выходит.

Помогите, пожалуйста.

Заранее благодарю!

A
На сайте с 19.07.2010
Offline
130
#1

Особо не вникал, но бросилось в глаза: .*

Замените его на .*? т.е.


[0-9]{1,40},first_name:.*?,last_name:.[^,]*,sex:2,bdate:[0-9]{1,2}\.[0-9]{1,2}(\.(1985|1986|1987|1988|1989|1990|1991|1992|1993|1994|1995|1996|1997))?
.............
siv1987
На сайте с 02.04.2009
Offline
427
#2


^id:(\d+).*?,sex:2(?:,bdate:\d+\.\d+\.(?:198[5-9]|199[0-7]))?(?:,hidden:\d+)?$

(поиск много строчный - флаг m)

Может быть проще в цикле пройтись?


foreach($rows as $row){
if(strpos($row, 'sex:2') AND (!strpos($row, 'bdate:') OR preg_match('/bdate:\d+\.\d+\.(?:198[5-9]|199[0-7])/', $row)))
}
R
На сайте с 20.02.2015
Offline
59
#3

Если нужны строки и с вхождениями не особо надо возится, как вариант:

[^\n]+sex:2[^\n]+bdate:[^\n]+(?:\.19(85|86|87|88|89|90|91|92|93|94|95|96|97))


---------- Добавлено 03.04.2015 в 19:04 ----------

siv1987, с датами "198[5-9]|199[0-7]" хороший финт :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий