|
|
|
| В переменной $val записано слово "дура" в кодировке utf-8.
<?php
$name = iconv('cp1251', 'utf-8', "дУрак");
$name = eregi_replace($val, "***", $name);
echo " name $name ";
|
Получаем name дУрак, а предполагалось name ***к. Хотя, как следует из мануала, функция eregi_replace нечувствительна к регистру.
Почему так получается?
===============
Если задать $name = iconv('cp1251', 'utf-8', "дурак"), то работает нормально.
РНР версии 5. | |
|
|
|
|
|
|
|
для: Владимир55
(17.07.2010 в 20:37)
| | следует применять preg_replace с модификатором u (работа с utf-8) | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2010 в 20:43)
| | . | |
|
|
|
|
|
|
|
для: neadekvat
(17.07.2010 в 21:35)
| | 1. В мануалах при описании Модификаторов патэрна приведены только случаи логического задания условий формирования образца. А как быть, если, как в моем случае, образец задан переменной рнр ( у меня $val)? Куда тут вписать /u ?
2. Я также не смог придумать, как при использовании preg_replace и образца в виде переменной сделать так, что бы каждая буква образца учитывалась дважды - в нижнем и в верхнем регистре?
(функция eregi_replace регистронезависима). | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 00:05)
| | > как следует из мануала, функция eregi_replace нечувствительна к регистру.
как следует из мануала, функция eregi_replace - deprecated.
1. Так в значение переменной и записать с модификатором.
$val = '/pattern/u';
2. Для этого есть другой модификатор "i":
$val = '/pattern/ui';
PCRE Pattern Modifiers | |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 06:34)
| | [i]1. Так в значение переменной и записать с модификатором. $val = '/pattern/ui';
Этот прием не проходит. Переменная $val задается из других условий. Она и есть образец. Это ее надо вписать в условия выборки. Что-то ипа
<?php
$name = preg_replace ('/$val/ui', "***", $name);
|
Как это корректно сделать? | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 09:56)
| | Вот точно так же, только в "кавычках".
И шаблоны ereg* и preg* не совсем совместимы, возможно нужно будет править. Как минимум экранировать символ-ограничитель бэк-слэшем. | |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 10:02)
| | Как же все это сложно и ненадежно!
Вероятно, лучше с регулярными функциями вообще не связываться... | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 10:42)
| | Где сложно? Что ненадёжно? В функциями ereg* действительно теперь лучше не связываться. | |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 10:57)
| | Что-нибудь проглядишь, не заэкранируешь и на тесте дефект не обнаружишь, а потом он где-нибудь выползет и тогда в масштабах системы попробуй разберись! | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 11:05)
| | Ну да, но с такой логикой с программированием вообще лучше не связываться, а то что-нибудь проглядишь, не заэкранируешь... ))
Есть правила, их нужно всего лишь соблюдать. | |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 11:08)
| | Для меня регулярки хуже темного леса.
Вот как конкретно нужно написать это выражение, что бы быть уверенным, что оно будет правильно выполняться при любых значениях переменных $val и $name?
<?php
$name = preg_replace ("/$val/ui", "***", $name);
|
| |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 11:15)
| | Корректно при любых $val - такого не бывает. В $val должна быть строка - корректный шаблон PCRE, в $name должна быть строка в кодировке utf8, тогда так:
<?php
$name = preg_replace ('/'.str_replace('/', '\\/', $val)."/ui", "***", $name);
|
| |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 11:21)
| | Обе переменные строковые и обе в формате utf8. Это подходящие условия? | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 11:26)
| | Нет. Кроме этого, в $val всё-таки должен быть шаблон для движка PCRE. Если в шаблоне будет что то не так, конечно же работать не будет. | |
|
|
|
|
|
|
|
для: sms-send
(18.07.2010 в 11:32)
| | Нет? Тогда я уже совсем ничего не понимаю!
1. Что, переменная $val должна быть в кодировке 1251?
2. В шаблоне латиница, кириллица и цифры, а также пиробел. Разве это не допустимо? Чего в шаблоне не должно быть? | |
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 11:50)
| | Оба аргумента должны быть в utf8.
> Чего в шаблоне не должно быть?
Конструкций, которые в PCRE используются в качестве служебных. Сложно случайно нарваться. Сейчас не могу привести конкретный пример.. позже. | |
|
|
|
|
|
|
|
|
для: Владимир55
(18.07.2010 в 11:50)
| | Пардон, сразу не заметил продолжения.
а) Вообще-то есть функция preg_quote, которая автоматически экранирует всё, что может оказаться контекстночувствительным... И если в шаблон есть нужда вставлять произвольные строки, применяют именно её.
б) несовсем ((с) cheops) понятно, зачем в Вашем случае замена по шаблону, если ни одного RegExp-терма в этом шаблоне нет?
Может проще применить str_replace? Ну или mb_str_replace (bkb(или её там) в случае utf8?
PS. Парни, вам так сложно было про preg_quote упомянуть? | |
|
|
|