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

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

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

 

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

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

тема: Шаблон допустимых символов и слов preg_replace
 
 автор: zetrider   (18.02.2014 в 10:37)   письмо автору
 
 

Добрый день,

для безопасности получаемых данных от посетителей использую замену по шаблону:

$str = preg_replace('/[^0-9.()+-\/*%^:]/', '', $str);

/*
Пропускает только: Цифры, точку, скобки, +, -, \, *, %, ^, и двоеточие
*/


Понадобилось добавить исключение для слов:

bcsqrt
bcpow
round
ceil
floor


Как должен выглядеть шаблон с перечисляемыми допустимыми словами?

  Ответить  
 
 автор: ladan   (18.02.2014 в 23:44)   письмо автору
 
   для: zetrider   (18.02.2014 в 10:37)
 


$str = preg_replace('/[^0-9\.\(\)\+\-\/\*%\^:|bcsqrt|bcpow|round|ceil|floor]/', '', $str); 


Думаю будет работать!

  Ответить  
 
 автор: ZetRider   (20.02.2014 в 09:40)   письмо автору
 
   для: ladan   (18.02.2014 в 23:44)
 

Спасибо за ответ, но при таком правиле пропускает любую букву которая присутствует в словах.

Например, пропустит букву b или q

  Ответить  
 
 автор: duhon   (24.02.2014 в 18:22)   письмо автору
 
   для: ladan   (18.02.2014 в 23:44)
 

во благо истории, удали свой пример регулярки, он не просто не правильный, он заразный для новичков, у которых эта загадачная конструкция выполнит то что они хотели.
не существует такого синтаксиса!!!
 [bcsqrt|bcpow|round] 

это равносильно этому
[bosdqrtcpwun|]

<?php
var_dump
(preg_replace('/[bcsqrt|bcpow|round]/''<$0>''durow') === preg_replace('/[bosdqrtcpwun|]/''<$0>''durow')); //return bool(true)

обрати внимание как с легкостью слово 'durow' совпало с регуляркой [bcsqrt|bcpow|round]

  Ответить  
 
 автор: duhon   (24.02.2014 в 14:34)   письмо автору
 
   для: zetrider   (18.02.2014 в 10:37)
 

<?php
$str 
'round_l(12)';
echo 
preg_replace('@(bcsqrt|bcpow|round|ceil|floor)\K|[^0-9.()+-/*%^:]@'''$str);


Output for 4.4.9, 5.2.4 - 5.6.0alpha2
round(12)

подходит?

если вдруг нужно пропускать именно как слова то окантуй первое условие \b тоесть
@\b(bcsqrt|bcpow|round|ceil|floor)\b\K|[^0-9.()+-/*%^:]@

  Ответить  
 
 автор: ZetRider   (25.02.2014 в 09:39)   письмо автору
 
   для: duhon   (24.02.2014 в 14:34)
 

Вот как оказалось.. Спасибо! Очень помогли.

Для меня подойдет первый, более мягкий вариант на проверку.

K - это модификатор? Что он означает?

  Ответить  
 
 автор: duhon   (25.02.2014 в 17:02)   письмо автору
 
   для: ZetRider   (25.02.2014 в 09:39)
 

это метосимвол http://www.php.net/manual/ru/regexp.reference.escape.php самый последний абзац

особенно удобно в таких случаях
echo preg_replace('/start\K delete/', '', 'text start delete and delete othe'); //Output for 4.4.9, 5.2.4 - 5.6.0alpha2 'text start and delete othe'

в твоем случае я сделал просто но не изящно, при нахождении названия функций ты удаляеш пустоту. Звучит странно, но зато работает :)

З.Ы. кстати в регулярке которую ты изначально написал а я модифицировал заложен один нюанс. Точно не нужно экранировать тире/минус? та как в середине символьного класа это обозначает диапазон значений от знака + до / в ascii таблице (тоесть твоя регулярка дополнительно пропускат запятые). И еще в описании ты возможно перепутал, пропускает / (слеш) но не \ (бекслеш)

  Ответить  
 
 автор: ZetRider   (25.02.2014 в 20:51)   письмо автору
 
   для: duhon   (25.02.2014 в 17:02)
 

Спасибо за решение и объяснение, буду разбираться.

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

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