Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Непонятки с eregi_replace
 
 автор: Владимир55   (17.07.2010 в 20:37)   письмо автору
 
 

В переменной $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.

  Ответить  
 
 автор: Trianon   (17.07.2010 в 20:43)   письмо автору
 
   для: Владимир55   (17.07.2010 в 20:37)
 

следует применять preg_replace с модификатором u (работа с utf-8)

  Ответить  
 
 автор: neadekvat   (17.07.2010 в 21:35)   письмо автору
 
   для: Trianon   (17.07.2010 в 20:43)
 

.

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 00:05)   письмо автору
 
   для: neadekvat   (17.07.2010 в 21:35)
 

1. В мануалах при описании Модификаторов патэрна приведены только случаи логического задания условий формирования образца. А как быть, если, как в моем случае, образец задан переменной рнр ( у меня $val)? Куда тут вписать /u ?

2. Я также не смог придумать, как при использовании preg_replace и образца в виде переменной сделать так, что бы каждая буква образца учитывалась дважды - в нижнем и в верхнем регистре?

(функция eregi_replace регистронезависима).

  Ответить  
 
 автор: sms-send   (18.07.2010 в 06:34)   письмо автору
 
   для: Владимир55   (18.07.2010 в 00:05)
 

> как следует из мануала, функция eregi_replace нечувствительна к регистру.
как следует из мануала, функция eregi_replace - deprecated.

1. Так в значение переменной и записать с модификатором.
$val = '/pattern/u';

2. Для этого есть другой модификатор "i":
$val = '/pattern/ui';

PCRE Pattern Modifiers

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 09:56)   письмо автору
 
   для: sms-send   (18.07.2010 в 06:34)
 

[i]1. Так в значение переменной и записать с модификатором. $val = '/pattern/ui';

Этот прием не проходит. Переменная $val задается из других условий. Она и есть образец. Это ее надо вписать в условия выборки. Что-то ипа

<?php 
    $name 
preg_replace ('/$val/ui'"***"$name);


Как это корректно сделать?

  Ответить  
 
 автор: sms-send   (18.07.2010 в 10:02)   письмо автору
 
   для: Владимир55   (18.07.2010 в 09:56)
 

Вот точно так же, только в "кавычках".

И шаблоны ereg* и preg* не совсем совместимы, возможно нужно будет править. Как минимум экранировать символ-ограничитель бэк-слэшем.

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 10:42)   письмо автору
 
   для: sms-send   (18.07.2010 в 10:02)
 

Как же все это сложно и ненадежно!
Вероятно, лучше с регулярными функциями вообще не связываться...

  Ответить  
 
 автор: sms-send   (18.07.2010 в 10:57)   письмо автору
 
   для: Владимир55   (18.07.2010 в 10:42)
 

Где сложно? Что ненадёжно? В функциями ereg* действительно теперь лучше не связываться.

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 11:05)   письмо автору
 
   для: sms-send   (18.07.2010 в 10:57)
 

Что-нибудь проглядишь, не заэкранируешь и на тесте дефект не обнаружишь, а потом он где-нибудь выползет и тогда в масштабах системы попробуй разберись!

  Ответить  
 
 автор: sms-send   (18.07.2010 в 11:08)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:05)
 

Ну да, но с такой логикой с программированием вообще лучше не связываться, а то что-нибудь проглядишь, не заэкранируешь... ))

Есть правила, их нужно всего лишь соблюдать.

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 11:15)   письмо автору
 
   для: sms-send   (18.07.2010 в 11:08)
 

Для меня регулярки хуже темного леса.

Вот как конкретно нужно написать это выражение, что бы быть уверенным, что оно будет правильно выполняться при любых значениях переменных $val и $name?

<?php  
    $name 
preg_replace ("/$val/ui""***"$name);

  Ответить  
 
 автор: sms-send   (18.07.2010 в 11:21)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:15)
 

Корректно при любых $val - такого не бывает. В $val должна быть строка - корректный шаблон PCRE, в $name должна быть строка в кодировке utf8, тогда так:

<?php
$name 
preg_replace ('/'.str_replace('/''\\/'$val)."/ui""***"$name);

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 11:26)   письмо автору
 
   для: sms-send   (18.07.2010 в 11:21)
 

Обе переменные строковые и обе в формате utf8. Это подходящие условия?

  Ответить  
 
 автор: sms-send   (18.07.2010 в 11:32)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:26)
 

Нет. Кроме этого, в $val всё-таки должен быть шаблон для движка PCRE. Если в шаблоне будет что то не так, конечно же работать не будет.

  Ответить  
 
 автор: Владимир55   (18.07.2010 в 11:50)   письмо автору
 
   для: sms-send   (18.07.2010 в 11:32)
 

Нет? Тогда я уже совсем ничего не понимаю!

1. Что, переменная $val должна быть в кодировке 1251?

2. В шаблоне латиница, кириллица и цифры, а также пиробел. Разве это не допустимо? Чего в шаблоне не должно быть?

  Ответить  
 
 автор: sms-send   (18.07.2010 в 12:01)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:50)
 

Оба аргумента должны быть в utf8.

> Чего в шаблоне не должно быть?
Конструкций, которые в PCRE используются в качестве служебных. Сложно случайно нарваться. Сейчас не могу привести конкретный пример.. позже.

  Ответить  
 
 автор: neadekvat   (18.07.2010 в 13:14)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:50)
 

Качайте, читайте, вникайте.

  Ответить  
 
 автор: Trianon   (20.07.2010 в 10:29)   письмо автору
 
   для: Владимир55   (18.07.2010 в 11:50)
 

Пардон, сразу не заметил продолжения.

а) Вообще-то есть функция preg_quote, которая автоматически экранирует всё, что может оказаться контекстночувствительным... И если в шаблон есть нужда вставлять произвольные строки, применяют именно её.
б) несовсем ((с) cheops) понятно, зачем в Вашем случае замена по шаблону, если ни одного RegExp-терма в этом шаблоне нет?
Может проще применить str_replace? Ну или mb_str_replace (bkb(или её там) в случае utf8?


PS. Парни, вам так сложно было про preg_quote упомянуть?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования