В регулярном выражении вы можете «захватить» части согласованной строки с помощью (brackets)
; в этом случае вы захватываете (^|_)
и ([a-z])
части матча. Они нумеруются начиная с 1, поэтому у вас есть обратные ссылки 1 и 2. Матч 0 - это вся строка с согласованием.
Модификатор /e
принимает заменяющую строку и заменяет обратную косую черту с последующим номером ( например, \1
) с соответствующей обратной ссылкой, но поскольку вы находитесь внутри строки, вам нужно избежать обратной косой черты, чтобы вы получили '\\1'
. Затем он (эффективно) запускает eval
, чтобы запустить результирующую строку, как если бы это был PHP-код (поэтому он устарел, потому что его легко использовать eval
небезопасным способом).
Функция preg_replace_callback
вместо этого выполняет функцию обратного вызова и передает ей массив, содержащий совпадающие обратные ссылки. Итак, где бы вы написали '\\1'
, вместо этого вы получите доступ к элементу 1 этого параметра - например. если у вас есть анонимная функция формы function($matches) { ... }
, первая обратная ссылка - $matches[1]
внутри этой функции.
Итак, аргумент /e
в
'do_stuff(\\1) . "and" . do_stuff(\\2)'
может стать обратным вызовом
function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }
. Или в вашем случае
'strtoupper("\\2")'
может стать
function($m) { return strtoupper($m[2]); }
Обратите внимание, что $m
и $matches
не являются волшебными именами, это просто имя параметра, которое я дал при объявлении моих функций обратного вызова. Кроме того, вам не нужно передавать анонимную функцию, это может быть имя функции в виде строки или что-то вроде формы array($object, $method)
, как с любым обратным вызовом в PHP , например
function stuffy_callback($things) {
return do_stuff($things[1]) . "and" . do_stuff($things[2]);
}
$foo = preg_replace_callback('/([a-z]+) and ([a-z]+)/', 'stuffy_callback', 'fish and chips');
Как и в любой функции, вы не можете получить доступ к переменным вне вашего обратного вызова (из окружения) по умолчанию. При использовании анонимной функции вы можете использовать ключевое слово use
для импорта переменных, которые вам нужны для доступа, , как описано в руководстве по PHP . например если старый аргумент был
'do_stuff(\\1, $foo)'
, тогда новый обратный вызов может выглядеть как
function($m) use ($foo) { return do_stuff($m[1], $foo); }
preg_replace_callback
- вместо модификатора /e
в регулярном выражении, поэтому вам нужно удалить этот флаг из вашего аргумента «pattern». Таким образом, шаблон, подобный /blah(.*)blah/mei
, станет /blah(.*)blah/mi
. /e
использовал внутри аргумента addslashes()
вариант, поэтому некоторые замены использовали stripslashes()
для его удаления; в большинстве случаев вы, вероятно, хотите удалить вызов stripslashes
из вашего нового обратного вызова. "Хорошо" субъективное решение. Необходимо будет смотреть на клиентуру и видеть то, что они используют.
Однако я отбросил поддержку Win2K более чем год назад без негативного воздействия.
Много компьютеров в моей компании использует Win2k, таким образом, мы не могли действительно отбросить поддержку. Все это зависит от клиентуры.
Это очень субъективно, это действительно зависит, кому Вы продаете.
Если это - среднестатистический американец затем, владельцы Windows 2K собираются быть в лучшем случае процентом или двумя из Вашего целевого рынка. Если это - вооруженные силы (кто я верю все еще выполненному 2K на их toughbooks), затем, Вы в беде.
Я сказал бы да, поскольку большинство переключилось на XP или перспективу, от того, что я могу сказать.
Так как XP 5/6 года теперь, я думаю, что большинство домашних пользователей будет использовать его, но многие бизнес-пользователи могут все еще использовать его. в целом, это зависит от Вашей целевой аудитории. Лично я расценил бы поддержку Windows 2000 в качестве награды, а не требование.
Это не просто "в порядке"; это - хорошая идея. Что-либо, чтобы поощрить отстающих держать в курсе является хорошей вещью.
Последняя версия WinRAR все еще поддерживает Windows 95. Думайте об этом, почему это? Это - потому что WinRAR решает чрезвычайно типичную проблему - распаковки файла. Люди все еще используют более старые системы, не потому что им нравятся они, но потому что они вынуждены к аппаратными средствами. Если Вы делаете видеоигру, уверенную, отбрасываете поддержку чего-нибудь ниже XP SP2, но если Вы делаете программу, которая решает определенную задачу, как преобразование RTF к PDF, я не вижу оснований для не поддержки других систем.
Его штраф мной :) Компания я работаю на (горную промышленность и строительство) с <15k сотрудники и мы не поддерживаем Wink2k и имеем не некоторое время.
Я сказал бы, что MS принял решение для Вас, если они сами привычка поддерживают его в.NET 3.5.