powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / regex
7 сообщений из 7, страница 1 из 1
regex
    #39409571
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть переменная $str, которая может принимать следующие значения

Код: sql
1.
$1

Код: sql
1.
$1\|$2\|$3\|$5698456095680


- то есть цифры со знаком $ и их разделитель \|

Пытаюсь проверять на валидность по preg_match('/(#+\d+(\\\|)?)+/',$str), но совсем криво выходит. Не понимаю как сделать правильную точную проверку. Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
regex
    #39409590
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навскидку
Код: php
1.
'/^\$\d+(\\\|\$\d+)*$/'

Не?
...
Рейтинг: 0 / 0
regex
    #39409961
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оно! Спасибо.
...
Рейтинг: 0 / 0
regex
    #39409974
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
<?php
$str1 = '#1\|#2';
echo (preg_match('/^#\d+(\\\|#\d+)*$/',$str1)) ? 1 : 2;


Не понимаю... В онлайн регекс спеллчекере пишет всё хорошо, а на деле пишет двойку. Как это?
...
Рейтинг: 0 / 0
regex
    #39410140
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У кого-то есть соображения почему выше написанный скрипт выводит 2, вместо 1?
...
Рейтинг: 0 / 0
regex
    #39410222
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший вопрос!

Регексп не находит соответствие, так понимаю. По крайней мере, если поставить третий параметр в preg_match и упростить выражение до
Код: php
1.
'/^#\d+\\\|#\d+$/'

, то найдено будет лишь " #1\ " - часть строки до "|". Что не так с этим символом - сходу не понятно.

А вот такое выражение
Код: php
1.
'/^#\d+(\\\[|]#\d+)*$/'

находит соответствие. Почему именно пришлось одновременно добавить и класс и, вроде бы, лишнее экранирование - объяснить затрудняюсь.

В доке, вроде, явно не сказано про использование "|" как текстового символа, а не как признака выбора одного из нескольких вариантов. Потому считал, что его следует экранировать как обычно. Однако, видимо, это не так.
...
Рейтинг: 0 / 0
regex
    #39410382
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey10,
проблема в обработке литерала бэкслэша процессором регулярных выражений php. Два и три бэкслэша подряд интерпретируются одинаково.
В таких случаях я пользовался hex представлением бэкслэша \x5c :
Код: php
1.
2.
3.
4.
$str = '$1\|$21\|$321';
$re  = '/^\$\d+(?:\x5c\|\$\d+)*$/';

echo preg_match($re, $str) ? 1 : 0;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / regex
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]