Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
artur4ek94
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 108
1

Некоректно работает регулярное выражение

31.10.2016, 23:47. Просмотров 946. Ответов 23
Метки нет (Все метки)

Доброго времени суток!
Как доработать это регулярное выражение под следующий файл(во вложении)?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$file = file('data.txt');
foreach($file as $k => $v){
if(!preg_match("~^(?:(?:[0-9]|[12][0-9]|3[0-1])\.
                           (?:0[0-9]|1[0-2])\.
                           (?:\\d{2})/
                           (?:0?[0-9]|1[0-9]|2[0-3])\:
                           (?:[0-5][0-9])/
                           [\\wа-Я]+\\s*)$~xi",$v))
{
    echo "Ошибка в строке: ".($k+1);
}       else echo $v;
        echo "<br>";
}
На данный момент проблема с распознаванием русских символов и строк в третей колонке каждой строки, и годом в 1й колонке.
0
Миниатюры
Некоректно работает регулярное выражение  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2016, 23:47
Ответы с готовыми решениями:

Не работает регулярное выражение
Ребзи, не работает простое регулярное выражение: $content = 'какая то...

Не работает регулярное выражение
Здравствуйте! В общем так, ниже демонстрационный пример. Обратить внимание...

Не работает простое регулярное выражение
Здравствуйте! У меня не работает простое выражение: if (eregi('S{20}',...

Не работает регулярное выражение для странички в utf-8 при парсинге странички с кодом в utf-8
Здравствуйте! Сточил мозг в раздумъях и решил к Вам обратиться, может поможете....

Регулярное выражение
Подскажите пожалуйста, как из строки...

23
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 02:33 2
О, моя регулярочка.
Вот пожалуйста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
foreach(file('data.txt') as $k => $v){
if(!preg_match("~^(?:(?:[0-9]|[12][0-9]|3[0-1])\.
                           (?:0[0-9]|1[0-2])\.
                           (?:\\d{2})/
                           (?:0?[0-9]|1[0-9]|2[0-3])\:
                           (?:[0-5][0-9])/
                           (?:[\\wа-яА-Я]+\\s*)+)$~xui",$v))
{
    echo "Ошибка в строке: ".($k+1);
}       else echo $v;
        echo "<br>";
}
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 10:09 3
06.01.2008 - 06 не словит
(?:\\d{2}) - это вроде как должен быть год... 4х значный
и зачем \\
1
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16754 / 6645 / 864
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
01.11.2016, 10:33 4
Цитата Сообщение от полудух Посмотреть сообщение
и зачем \\
потому что так правильно Первый слэш - для PCRE, сама последовательность, второй - экранирование строки PHP. С примерами - Что обозначает эта строка
1
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 10:47 5
Лучший ответ Сообщение было отмечено artur4ek94 как решение

Решение

Цитата Сообщение от полудух Посмотреть сообщение
(?:\\d{2}) - это вроде как должен быть год... 4х значный
Когда я делал регулярку (раньше была другая тема), были не много другие условие года были 2-х значные
2001 2002 2003 и т.д.
Ну тогда вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
foreach(['06.01.2001/12:00/любые символы'] as $k => $v){
if(!preg_match("~^(?:(?:0?[0-9]|[12][0-9]|3[0-1])\.
                           (?:0[0-9]|1[0-2])\.
                           (?:\\d{2}|\\d{4})/
                           (?:0?[0-9]|1[0-9]|2[0-3])\:
                           (?:[0-5][0-9])/
                           (?:[\\wа-яА-Я]+\\s*)+)$~xui",$v))
{
    echo "Ошибка в строке: ".($k+1);
}       else echo $v;
        echo "<br>";
}
1
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16754 / 6645 / 864
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
01.11.2016, 11:04 6
Цитата Сообщение от Azdeman Посмотреть сообщение
PHP
1
(?:0?[0-9]|[12][0-9]|3[0-1])
так же вроде лучше
PHP
1
(?:0?[1-9]|[12][0-9]|3[01])
2
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 11:06 7
Цитата Сообщение от KOPOJI Посмотреть сообщение
так же вроде лучше

Не по теме:

согласен .. всё таки не может быть 00 число. :D , чё то я это «провтыкал»

1
mrNTF
272 / 200 / 142
Регистрация: 22.01.2016
Сообщений: 637
01.11.2016, 14:09 8
Цитата Сообщение от KOPOJI Посмотреть сообщение
потому что так правильно Первый слэш - для PCRE, сама последовательность, второй - экранирование строки PHP.
Могли бы скинуть ссылку на авторитетный источник, где этот момент упоминается?
Просто я изучил довольно много материала и примеров на различных форумах по регуляркам и нигде, кроме как в ваших регулярках и регулярках Azdeman не встречал двойные слэши
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 15:48 9
Цитата Сообщение от mrNTF Посмотреть сообщение
Просто я изучил довольно много материала и примеров на различных форумах по регуляркам и нигде, кроме как в ваших регулярках и регулярках Azdeman не встречал двойные слэши
да и не нужны они

Добавлено через 2 минуты
Цитата Сообщение от KOPOJI Посмотреть сообщение
потому что так правильно Первый слэш - для PCRE, сама последовательность, второй - экранирование строки PHP. С примерами - Что обозначает эта строка
да не накосячит пых с \d
и в PCRE \d юзают, а не \\d
1
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 15:59 10
Цитата Сообщение от полудух Посмотреть сообщение
да не накосячит пых с \d
Обратный слэш \ в регулярке

Во-первых, это избавляет от неопределенности: есть такая последовательность или нет.

Во-вторых, даже если такой последовательности нет сейчас, никто не может гарантировать, что она не появится в PHP завтра. Подтверждение тому: последовательность \e , которая была добавлена в PHP 5.4 . Если у Вас в коде было написано
PHP
1
echo "\e";
и раньше оно выводило нужное Вам \ и e , а теперь вдруг стало означать совсем другое, то, по сути, это Ваша проблема. Если Вам был нужен \ и e , то так и надо было писать:
PHP
1
echo "\\e";
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 16:03 11
Цитата Сообщение от Azdeman Посмотреть сообщение
и раньше оно выводило нужное Вам \ и e , а теперь вдруг стало означать совсем другое, то, по сути, это Ваша проблема. Если Вам был нужен \ и e , то так и надо было писать:
быстрее вы запутаетесь с двойными слэшами и в итоге он вместо поиска \d будет искать \\ И d, т.е. отдельно слэш и букву
1
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 16:19 12
Цитата Сообщение от полудух Посмотреть сообщение
быстрее вы запутаетесь с двойными слэшами
Быстрее или нет, покажет время. При чём тут запутывание. Это вам легче запутаться ,захотите вывести строку \d таким способом
\\d число -- [0-9]
Вроде как экранировал , а тут тебе на, а оно ищет число, так же как \d и так же как [:digit:] , ставите еще один \, иии тогда уже всё как ожидали
\\\d строка -- \d
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 16:30 13
причём тут строка
зачем мне во время поиска регулярки выводить СТРОКУ ?!
жизнь себе усложняете только
1
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
01.11.2016, 16:33 14
Цитата Сообщение от полудух Посмотреть сообщение
зачем мне во время поиска регулярки выводить СТРОКУ ?!

Не по теме:

не во время, а как результат поиска.

1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 16:39 15
что результат поиска??
надо будет мне найти \d, как 2 разных символа рядом, тогда и заэкранирую слэш, а так то нафига мне \\d писать вы так и не ответили
пример хоть приведите, где не работает \d
1
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16754 / 6645 / 864
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
01.11.2016, 16:53 16
Цитата Сообщение от полудух Посмотреть сообщение
и в PCRE \d юзают, а не \\d
вы не прочитали по ссылке, видимо. Я не говорил, что в PCRE используется \\d. Я сказал, что второй слэш - экранирование символа для PHP, а не для PCRE.
Цитата Сообщение от полудух Посмотреть сообщение
быстрее вы запутаетесь с двойными слэшами
не первый год уже так пишу, и ни разу еще не запутался. Повторюсь (по ссылке это есть), в том же Java написание \d вместо \\d вообще выдаст ошибку - и никто не запутывается.
Цитата Сообщение от полудух Посмотреть сообщение
в итоге он вместо поиска \d будет искать \\ И d, т.е. отдельно слэш и букву
это вообще полный бред. Еще раз говорю, перейдите по ссылкам и посмотрите объяснение необходимости дублирования экранирования Использовать двойной слэш - это как раз правильный способ подстановки escape-последовательности в регулярку в PHP. Используя одинарный слэш вы полагаетесь на то, что PHP достаточно "умный" и преобразует так, как надо, но не всегда это так - пример такого поведения есть по ссылкам что у меня, что у Azdeman.
Цитата Сообщение от полудух Посмотреть сообщение
надо будет мне найти \d, как 2 разных символа рядом, тогда и заэкранирую слэш, а так то нафига мне \\d писать вы так и не ответили
'\d' в регулярках на PHP абсолютно равнозначно '\\d'. А если вы захотите "найти \d, как 2 разных символа рядом", то вам надо будет писать '\\\\d', а не '\\d'
Цитата Сообщение от полудух Посмотреть сообщение
пример хоть приведите, где не работает \d
где и кто говорил, что \d не будет работать?
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
01.11.2016, 18:45 17
Цитата Сообщение от KOPOJI Посмотреть сообщение
где и кто говорил, что \d не будет работать?
кто бы это мог быть...
Цитата Сообщение от KOPOJI Посмотреть сообщение
Используя одинарный слэш вы полагаетесь на то, что PHP достаточно "умный" и преобразует так, как надо, но не всегда это так
Цитата Сообщение от KOPOJI Посмотреть сообщение
пример такого поведения есть по ссылкам что у меня, что у Azdeman
нет
вода в ступе там и более ничего
скучные теоретические рассуждения о том, как можно было бы жить, если бы Земля была квадратной
1
mrNTF
272 / 200 / 142
Регистрация: 22.01.2016
Сообщений: 637
01.11.2016, 18:52 18
Цитата Сообщение от KOPOJI Посмотреть сообщение
если вы захотите "найти \d, как 2 разных символа рядом", то вам надо будет писать '\\\\d', а не '\\d'
Зачем четыре \ ?
PHP
1
echo preg_match("~\\\d~", '\d') ? 'yes' : 'no'; # yes
1
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16754 / 6645 / 864
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
02.11.2016, 01:25 19
да, опечатался, три.

Добавлено через 6 часов 26 минут
кто бы это мог быть...
И кто же? Покажите, где я говорил, что именно последовательность \d будет некорректно отрабатывать?
Вот еще тема обратный слеш в регулярке
Если для вас все это вода в ступе, то обсуждать больше нечего, все равно будет бесполезно, пишите, как хотите - только не следует говорить, что это неправильно и придумывать, что это якобы будет искать отдельно символ обратного слэша, и букву d только потому, что вы так решили или используете другую форму записи.
1
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,056
02.11.2016, 01:47 20
Цитата Сообщение от KOPOJI Посмотреть сообщение
И кто же? Покажите, где я говорил, что именно последовательность \d будет некорректно отрабатывать?
да всё там же, где влезли со своими двойными слэшами, когда я говорил про \d
и там же где утверждаете, что "давно так делаете, потому что так правильно"
Цитата Сообщение от KOPOJI Посмотреть сообщение
потому что так правильно Первый слэш - для PCRE, сама последовательность, второй - экранирование строки PHP. С примерами - Что обозначает эта строка
если не хотели ничего говорить про \d, то и нечего путать людей.
все ваши ссылки в итоге рассказывают про совершенно другие случаи, когда например /^[a-z\\]{0,}$/ не сработает, потому что двойного слэша мало, надо 4
хотя речь была про \d
накой спрашивается вы влезаете с совершенно левой историей в тему про \d - непонятно

Вот еще тема обратный слеш в регулярке
Если для вас все это вода в ступе, то обсуждать больше нечего, все равно будет бесполезно, пишите, как хотите - только не следует говорить, что это неправильно и придумывать, что это якобы будет искать отдельно символ обратного слэша, и букву d только потому, что вы так решили или используете другую форму записи.
что я решил?? здесь: \\\\d - ЧТО он будет искать??

Цитата Сообщение от KOPOJI Посмотреть сообщение
Использовать двойной слэш - это как раз правильный способ подстановки escape-последовательности в регулярку в PHP.
вы бы уже ссылку на документацию дали, например PCRE или, на худой конец, PHP, где говорится, что надо непременно \\d, а не на свои "темы", где люди _привыкли_ делать так.

говорить тут изначально было не о чем. От того что вы там делаете так то и так то исходный код не поменяется и работать не перестанет.
0
02.11.2016, 01:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2016, 01:47

Регулярное выражение
Вот у меня есть текст $ 0.03 USD как мне оставить только 0.03?

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

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


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

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

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