С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
1

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

26.07.2013, 15:30. Просмотров 1426. Ответов 9
Метки нет (Все метки)

Есть строка вида:
PHP
1
"12345678,54543234,01928374"
Числа из восеми цифр идут через запятую. Нужно выражение, которое проверит, что это действительно так. Запятой после последнего числа нет. Все числа - это набор цифр и только. Пробовал составить - не получилось...
PHP
1
'/(\d{8}),/'
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 15:30
Ответы с готовыми решениями:

Регулярное выражение
Всем привет. Задача такая, найти в тексте аналог html тега Не могу понять,...

Регулярное выражение
Здравствуйте. Столкнулся с проблемой: нужно найти и удалить все элементы...

Регулярное выражение. >,<,=
Нужно выбрать из таблицы только числа больше 1.000 Пишу :...

Регулярное выражение
3,2,,,, 1,2,3,4,5 1,3,5,4,2 5,3,5,6,4 выражение : ,,,, возвращает 3...

Регулярное выражение.
Добрый день! Не могу разобраться с регулярным выражением. Есть строка: ...

9
rus_dao
19 / 19 / 3
Регистрация: 26.07.2013
Сообщений: 61
26.07.2013, 17:52 2
если бы условия были покорректнее написаны...
вот рабочий код
PHP
1
2
3
4
5
$string = "12345678,54543234,01928374";
if (preg_match_all('|([\d]){8}\,*|s', $string, $data)) {
echo "это действительно так\n";
print_r ($data[0]);}
else {echo "увы, но это действительно не так";}
0
skaa
Хочу в Исландию
1035 / 834 / 119
Регистрация: 10.11.2010
Сообщений: 1,629
26.07.2013, 17:56 3
/^\d{8},\d{8},\d{8}$/
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
26.07.2013, 20:50  [ТС] 4
Цитата Сообщение от rus_dao Посмотреть сообщение
если бы условия были покорректнее написаны...
Да, видимо не до конца все описал, еще раз:

Есть строка вида:
PHP
1
"12345678,54543234,01928374"
Т.е. [восемь цифр][запятая][восемь цифр][запятая][восемь цифр][запятая][восемь цифр]и т.д. Строка может как не содержать ничего, так и содержать неизвестное количество восьмизначных чисел через запятую. Все, больше в ней никаких других символов нет. Запятые стоят только МЕЖДУ числами.

Вот и проверка должна быть на это правило.

PHP
1
2
3
4
5
"12345678,5467" //Ошибка
"qwxkfere,12345678" //Ошибка
"12345678.65436894" //Ошибка
"tmf45gr3554kg;m45;c3345,,,4r" //(содержится непонятно что) Ошибка
"12345668,39773281" //Я,я - дас ист фантастиш!
А Ваш код пропускает первый пункт)
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16756 / 6647 / 866
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
26.07.2013, 21:31 5
Цитата Сообщение от rus_dao Посмотреть сообщение
\,*
звездочка в данном случае будет действовать только на последний стоящий символ. Таким образом, вместо любого количества повторений \d{8}, будет повторяться только запятая, т.е. "12345678,,,," подойдет под регулярку, а "12345678,12345678," не подойдет (вернее, подойдет, но не так, как ожидалось, см.далее). К тому же, не учитывается начало и конец строки, следовательно, регулярка спокойно пропустит любую строку, в которой есть 8 подряд следующих цифровых символов. Да и экранировать запятую не нужно.
Ну и самое главное..
Цитата Сообщение от [progeR] Посмотреть сообщение
Числа из восеми цифр идут через запятую. Нужно выражение, которое проверит, что это действительно так
Только проверит, не запомнит. Соответственно, не нужно preg_match_all, не нужно запоминание. В принципе, реализовать это можно как-то так..
PHP
1
2
3
4
5
6
7
8
$string = "12345678,54543234,01928374";
$pattern = '|^(?:\d{8},?)*(?<!,)$|';
if (preg_match($pattern, $string)) {
    echo "ok";
}
else {
    echo "fail";
}
Но у такой регулярки также есть недочеты.. В частности, самый главный - то, что запятые можно вообще опустит.. Не знаю, как правильно записать, к сожалению, не настолько силен в регулярках, все, что приходит на ум - проверять конец строки или нет в условии, и если да - то не проверять наличие запятой, а если нет, то проверять. Но каким образом узнать, конец строки это или нет, не знаю.. Хотя уверен, что есть куда более элегантные решения, нежели пришедший ко мне в голову костыль
0
rus_dao
19 / 19 / 3
Регистрация: 26.07.2013
Сообщений: 61
26.07.2013, 21:42 6
моё регулярное выражение буквально означает следующее: ищется восемь десятичных цифр подряд с необязательной запятой после восьми чисел. то есть это выражение ищет вхождение числа из 8 цифр и каждое вхождение записывает в массив. очень легко было бы написать выражения для заданного набора восьмизначных чисел через запятую. а для неизвестного количества надо подумать.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16756 / 6647 / 866
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
26.07.2013, 21:47 7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Но у такой регулярки также есть недочеты
PHP
1
2
3
4
5
6
7
8
$string = "12345678,54543234,01928374";
$pattern = '|^(?:\d{8}(?(?!\Z),))*(?<!,)$|';
if (preg_match($pattern, $string)){
    echo "ok";
}
else {
    echo "fail";
}
Добавлено через 1 минуту
Цитата Сообщение от rus_dao Посмотреть сообщение
моё регулярное выражение буквально означает следующее: ищется восемь десятичных цифр подряд с необязательной запятой после восьми чисел
Нее.. "Ищется восемь десятичных цифр подряд с любым количеством запятых после них", а не с необязательной запятой. "Необязательная запятая" будет, если заменить звездочку на знак вопроса.
0
rus_dao
19 / 19 / 3
Регистрация: 26.07.2013
Сообщений: 61
26.07.2013, 21:51 8
Цитата Сообщение от KOPOJI Посмотреть сообщение
"Ищется восемь десятичных цифр подряд с любым количеством запятых после них", а не с необязательной запятой. "Необязательная запятая" будет, если заменить звездочку на знак вопроса.
точно, абсолютно верно. подразумевался знак вопроса
0
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
27.07.2013, 07:40 9
Код
/^\d{8}+(?:,\d{8}+)*+$/D
2
KOPOJI
27.07.2013, 10:00     Регулярное выражение
  #10

Не по теме:

я же говорил, что есть более элегантные решения :)

0
27.07.2013, 10:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 10:00
Привет! Вот еще темы с ответами:

регулярное выражение
Имеем строку http://img.yandex.net/i/www/logo.png нужно вытащить то что между...

Регулярное выражение
Здравствуйте.Подскажите.В тексте встречаются такие подстроки ---Universal...

Регулярное выражение
Каким регулярным выражением для notepad++ можно урлы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru