Сайт Романа ПарпалакаБлог20110116

Загадка специалистам по PHP

16 января 2011 года, 12:53

Как вы думаете, что выведут следующие операторы?

<?php

echo preg_match('#тес#iu', 'Такой Вот Тест');
echo preg_match('#Тес#Siu', 'Такой Вот Тест');
echo preg_match('#тес#Siu', 'Такой Вот Тест');
echo preg_match('#во#Siu', 'Такой Вот Тест');

Логика подсказывает, что 1111, а на опыте оказалось 1101. Причем и в Windows, и в Linux (Debian, PHP 5.2.6). Я подумал, что комбинация модификаторов Siu несовместима (и даже убрал в отлаживаемом коде модификатор S). Но почему тогда последнее регулярное выражение срабатывает правильно?

Кто подскажет, в чем тут дело?

Поделиться

Образование и патриотизм Ctrl И опять Firefox

Читайте также

Не храните бизнес-логику в базе данных
Современные базы данных не только хранят эти самые данные, но и обрабатывают их с помощью пользовательских функций, хранимых процедур, триггеров. После знакомства с этими инструментами у разработчика возникает мысль перенести часть бизнес-логики из кода приложения в базу.
2019
Как покрыть тестами устаревший код?
Многим разработчикам приходилось поддерживать и дорабатывать устаревшие приложения, в которых никогда не было автотестов. С помощью приемочных тестов библиотеки Codeception можно покрыть веб-приложение на любом фреймворке и даже на любых языках.
2023
#.*#/u
У регулярных выражений PHP есть специальный модификатор u для работы со строками в кодировке UTF-8. Оказывается, вставлять этот модификатор во все подряд регулярные выражения не только бессмысленно, но и вредно.
2010
Iceweasel
Некоторое время назад я писал о том, как работает клиентская часть SiteX'а в Safari 3.0 beta. Напомню, что работала она неправильно.
2008

Комментарии

#1. 26 января 2011 года, 01:03. Андрей Колпаков пишет:
У меня выводит 1111 на PHP 5.3.4.

Предположу, что в твоем случае такой эффект дает ошибка PHP :-)
#2. 26 января 2011 года, 01:16. пишет:
Или ошибка в библиотеке для работы с регулярными выражениями, с которой скомпилирован PHP.

Кстати, проверил только что на сервере, к которому есть доступ и у тебя, и у меня :)
Там PHP 5.3.2 и выдает 1101.
#3. 27 января 2011 года, 21:41. Андрей Колпаков пишет:
А в таком случае:

echo preg_match('#tes#iu', 'This Is Test');
echo preg_match('#Tes#Siu', 'This Is Test');
echo preg_match('#tes#Siu', 'This Is Test');
echo preg_match('#is#Siu', 'This Is Test');

наш сервер выдает 1111.

То есть, в этой библиотеке ошибка для регистров non-ASCII символов при наличии модификатора S.

Даже жалко, что уже исправили. А то можно было бы засандалить баг авторам PHP или авторам библиотеки! :-)

Оставьте свой комментарий


Формулы на латехе: $$f(x) = x^2-\sqrt{x}$$ превратится в $$f(x) = x^2-\sqrt{x}$$.
Выделение текста: [i]курсивом[/i] или [b]жирным[/b].
Цитату оформляйте так: [q = имя автора]цитата[/q] или [q]еще цитата[/q].
Других команд или HTML-тегов здесь нет.

Записи