Не понимание регулярного выражения

167
16 ноября 2018, 21:00

Есть регулярка:

preg_match('/[^.]+/', 'hello.bye', $matches);
print_r($matches);
Array
(
    [0] => hello
)

Документация:

. - любой символ, кроме перевода строки.

Так почему же шаблон не видит точки и то что находится за ней, если "любой символ"?

Answer 1

[^.] находит любой символ, отличный от символа ., так как [^...] образует исключающий символьный класс, находящий любой символ, отличный от заданных в классе.

См. Символьные классы в справке по PHP:

Символьный класс соответствует одиночному символу обрабатываемой строки, причем сам символ должен содержаться в наборе, определяемым классом. В случае, если первым символом описания класса является '^', логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом. Если символ '^' необходим как член класса, его не следует помещать первым символом в описании класса либо необходимо экранировать при помощи обратного слеша.

Внутри символьных классов . не является специальным метасимволом, находящим любой символ, отличный от знака перевода строки (как и многие другие метасимволы). Снова смотрим справку:

Вне символьного класса точка соответствует любому (в том числе и непечатному, бинарному) символу, кроме символа перевода строки '\n' (в обычном режиме). В случае, если используется модификатор PCRE_DOTALL, точка соответствует также символу перевода строки. Обработка метасимвола "точка", никак не связана с метасимволами начала и конца строки, единственное, что у них общего - так это специальное отношение к символу перевода строки. Внутри символьного класса точка не имеет специального значения.

Вам нужен

preg_match('/.+/', 'hello.bye', $matches);

См. PHP-демо онлайн.

Шаблон .+ найдет 1 и более символов, отличных от знаков перехода на новую строку.

READ ALSO
php получить число с текущего url

php получить число с текущего url

url в таком виде https://mysite/news/0/2 Как поместить в одну переменную 0 а в другую 2? количество знаков может менятся к примеру https://mysite/news/20/232

183
Swift_TransportException Expected response code 250 but got code “535”

Swift_TransportException Expected response code 250 but got code “535”

При отправке почты с сервера возникает эта ошибка

190
Редиректы с 404 страниц на codeigniter?

Редиректы с 404 страниц на codeigniter?

Интеерсует как реализовать функционал редиректов на codeigniter

159
Помогите, чего данные не записываются в БД?

Помогите, чего данные не записываются в БД?

есть apiкоторое обрабатывает запрос и записывает в бд

185