Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтр слов 
:(
    Опции темы
Mal Hack
Дата 31.7.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Плохое решение. ЛУчше 1 раз пройтись большой регуляркой, чем много маленькими.
Хотя и не всегда.
Да и замудренно как-то это.
Плюс, модификатор e сильно кушает память и может вызвать неприятности.
Плюс, помним, что ьез установки локали RegEX не будет работать с кирилицей в паттерне.
Код

<?php

    function repl( $matches )
    {
        global $b;
        global $a;
        print_r($matches);
        return $matches[1] . $b[ array_search( $matches[2] , $a ) ] . $matches[3];
    }
    
    $a = array ("aaa","1234","bbb");
    $b = array ("ббб","4321","юй");
    $str = "aaa gaaa 1bbb bbb2 ccc qqq bbb! .aaa.";
    
    $itog = preg_replace_callback("#([\s.-=;])(".implode($a,"|").")([\s.-=;])#i", "repl", $str);

    print $itog;
    
?>
 
PM ICQ   Вверх
GiV
Дата 31.7.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Цитата(Mal Hack @  31.7.2006,  14:35 Найти цитируемый пост)
Плохое решение. ЛУчше 1 раз пройтись большой регуляркой, чем много маленькими.
Хотя и не всегда.

не всегда, хотя в данном случае правда Ваша. preg_replace с модификатором e работает медленне replace_callback 
+ мы всегда будем проходить все n итерации (n-количество элементов в массиве для замены), что в худшем случае (ни одного вхождения искомого ключа в строку) все n раз заставит сработать preg_replace в холостую. В то время как большой прег выполнится только ОДИН раз, там выигрыши получаются от 2-х мс...

И [\s.-=;] все же не все элементы включены (таб, запятая, восклицательный знак, двоеточие и т.д.), класс [^А-Яа-яA-Za-z] все же лучше. 

P.S. при достижении 100 с меня +. 

Это сообщение отредактировал(а) GiV - 31.7.2006, 16:27
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 31.7.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Наверное я слишком многое хочу  smile 


Mal Hack, не все условия выполняются: замена происходит только если в начале стоит цифра, пробелы или точки, остальные не меняются... 

Т.е. ещё нужны условия: граничит с восклицательным знаком, когда слово идёт сначала, когда заканчивается на цифру (или скорее всего не на букву)

 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 31.7.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
не всегда

Причем далеко не всегда. И сильно зависит от многих факторов.
В свое время пришлось на этом деле @ схомячить.

Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
мы всегда будем проходить все n итерации (n-количество элементов в массиве для замены), что в худшем случае (ни одного вхождения искомого ключа в строку) все n раз заставит сработать preg_replace в холостую. 

Использование модификатора "e" очень частая ошибка многих пхпшников, которые наивно думают, что чем код короче, тем он быстрее smile
"e"незаменим, когда надо в заменяющую функцию передать НЕСКОЛЬКО параметров, часть из которых не из карманов. При работе с BB кодами e незаменим. Там уж никак.


Цитата(Gold Dragon @  31.7.2006,  18:12 Найти цитируемый пост)
щё нужны условия: граничит с восклицательным знаком, когда слово идёт сначала, когда заканчивается на цифру (или скорее всего не на букву)


Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
И [\s.-=;] все же не все элементы включены (таб, запятая, восклицательный знак, двоеточие и т.д.),


Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
класс [^А-Яа-яA-Za-z] все же лучше. 

Тут есть два момента. Первый - кирилица. Бывает глюит, надо локаль включать обязательно через set_locate().
Второй момент, все-таки помнтся мне, что был квантофикатор \b или \B, \W тут не подойдет.

И еще. [^А-Яа-яA-Za-z] все-таки большое-колво символов, а перечислив спецсимволы, как это сделал я, мы по логике получим в паттерне меньшее число проверок при компиляции, т.е. как мне кажется, указать все нужные спецсиволы будет лучше. 
PM ICQ   Вверх
GiV
Дата 31.7.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Цитата(Mal Hack @  31.7.2006,  18:58 Найти цитируемый пост)
Второй момент, все-таки помнтся мне, что был квантофикатор \b или \B, \W тут не подойдет.

Границы слова. Они тоже зависят от локали, так как определение идет фактически на таких раздельных регулярках ^\w, \w$, \w\W, \W\w, а \w и \W включают различные наборы символов (коды символов не только до 128, но и больше)


Цитата(Mal Hack @  31.7.2006,  18:58 Найти цитируемый пост)
И еще. [^А-Яа-яA-Za-z] все-таки большое-колво символов, а перечислив спецсимволы, как это сделал я, мы по логике получим в паттерне меньшее число проверок при компиляции, т.е. как мне кажется, указать все нужные спецсиволы будет лучше.

Ну в детали внутренней работы PCRE не вникал, так что пытаться что-либо доказать не буду. Я там не был, врать не стану. Можно попробовать попрофилировать код разных регулярок на одном и том же тектовом наборе, хотя это все частные случаи. 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 24.4.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



так.. вопрос опять всплыл, но сейчас чуть всё проще, нужно тупо заменять слова. Просто не хочу сильно вымудряться. В общем есть массив со словами
Код

$filtr = array(
    'aaa',
    'bbb',
    'ccc',
    'ddd'
);

обработка простая
Код

function filtr($str){
    GLOBAL $filtr;
    $str = str_replace($filtr, '...', $str);
    return $str;
}

но как мне сделать чтоб слова сравнивались без учёта регистра, чтоб не писать
Код

$filtr = array(
    'aaa',
    'AaA',
    'AAA',
    'Aaa'
);

я пытался сделать
Код

$a1 = str_replace($filtr, '...', strtolower($str));
$a2 = strtolower($str);
$a3 = str_replace($filtr, '...', $str);
и сравнивать их, но запутался в логике :)


Что подскажите?



Это сообщение отредактировал(а) Gold Dragon - 24.4.2007, 12:38


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
xolod
Дата 24.4.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

Репутация: 3
Всего: 13



Код

// Регистро-независимый вариант функции str_replace()
str_ireplace

PM MAIL   Вверх
Gold Dragon
Дата 24.4.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



О как??? А я и не знал....
А синтаксис у неё такой же?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.