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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Пример с опережающей проверкой из Фридла
Покинул форум
Сообщений всего: 170
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Всем привет,
Разбираюсь с Дж.Фридл - Регулярные выражения, 3-е изд.[2008].pdf
В примере с опережающей проверкой
пытаюсь выполнить прнимер в php:
Цитата:
Формальная постановка задачи уже приводилась выше: «вставить за
пятые во всех позициях, у которых количество цифр справа кратно
трем, а слева есть хотя бы одна цифра». .
1) В чем ошибка ?
2) А нет ли к этой книге примеров на пхп? Можеть кто делал? Особенно с опережающей проверкой...
Есть определенные сложности с понимаем примеров и хочется видеть рабочие примеры...
Спасибо!
Мелкий
Отправлено: 21 Июня, 2017 - 11:07:34
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Для начала вы просто напутали порядок параметров у preg_replace.
Второй момент - позиционные проверки не имеют длины. Поэтому только их брать в круглые скобки лишено смысла.
И третье: (\d\d\d)+$. Конец строки затребован? Да. А есть в тексте место, где после 3 цифр будет конец обрабатываемой строки? Нет, такого места нет.
----- PostgreSQL DBA
mstdmstd
Отправлено: 21 Июня, 2017 - 14:08:06
Частый гость
Покинул форум
Сообщений всего: 170
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Спасибо !
с пп1-2 понятно.
с п3 не сoвсем
В результате получилось:
Вот в этой позиции есть первое совпадение: 2 есть цифра, далее как минимум 3 цифры. Значит заменяем и передвигаем позицию на символ после выполненной замены
9 это тоже цифра, и далее есть ещё как минимум 3 цифры, снова заменяем.
И т.д. пока утверждение о 3 цифрах после позиции не становится ложным.
----- PostgreSQL DBA
rgl
Отправлено: 28 Августа, 2017 - 14:56:15
Новичок
Покинул форум
Сообщений всего: 56
Дата рег-ции: Авг. 2017 Откуда: замкадье
Помог: 1 раз(а)
mstdmstd пишет:
(?=(\d\d\d)+) # , у которых количество цифр справа кратно трем
Может, так: (?=(\d\d\d)+(\D|$)) # , у которых количество цифр справа кратно трем
Т.е. количество цифр кратно трем, когда после одной или нескольких троек идет не цифра или вообще ничего нет, а у вас такой проверки нет, т.е. проверятеся что есть хотя бы одна тройка, а что дальше - не важно
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.