С этим пока проблемы... Регулярки (синтаксис) только-только начал изучать по статьям Бородина и Сергея Колесниченко. Задача такая. Профильтровать переменную $name на следущее: Разрешены: русский алфавит, английский алфавит (но что бы не смешивались англ. и русс.), тильда "~", нижнее подчеркивание, пробел, восклицательный знак. Долго мучаюсь
что то типа Код (Text): #^(([а-я]|[a-z])[\~_ \!])$#i не помню, правильно ли задал интервал русских букв и не помню, как правильно записывается пробел (s чего то там), нет под рукой мануалов %)
antonn PHP: <?php $name = 'lose'; if (!preg_match("/^(([а-я]|[a-z])[\~_\s\!])$/i", $name)) echo 'Wrong'; else echo 'Correct'; ?> Выводит Wrong. Символ пробела - \s Интервал русских букв правильно задан Мне так кажется, ошибка где-то здесь: [\~_\s\!] P.s Скорее всего из-за условия. Т.к $name не обязательно должен содержать тильду, подчеркивание пробел и т.д. Просто они НЕ запрещены
дополню предыдущего оратора: PHP: <? function test($string) { $word = '([а-я]+|[a-z]+)'; // регулярко на слово $separator = '[~_ !]'; // на разделитель слова $re = "#^$word($separator+$word)*$#"; // минимум, подопытный должен содержать слово. Разделенные не меньше одним разделителем, могут быть еще слова. $re .= 'i'; // любой регистр $re .= 'u'; // строки в UTF-8 return (bool) preg_match($re, $string); } // ну и "парачка" тестов что это действительно так: $goodList = array( 'w', 'waka', 'waka waka', 'я', 'криведка', 'и порвилукракадилу', 'ну и с англицкими словами waka вот', 'разделителей_может!быть !~_ много', 'а СлоВа моГут имеТь ЛюбоЙ РЕГИСТР', ); foreach ($goodList as $string) if (!test($string)) echo $string,'<br />'; $blackList = array( '', ' ', 'wakaсрусским', 'неправильный#разделитель', 'неправильный # разделитель_с_пробелом', ' почему в начале и в конце разделители ', ); foreach ($blackList as $string) if (test($string)) echo $string,'<br />'; /* результат - список не прошедших проверку строк у меня пусто, а у Вас? */
Ti Угу, это уже лучше Спасибо за расширенный пример. Но тогда не проходят строки вида: !Ti! _TI_ А как мы знаем, пользователи любят приукрашить свои ники... PHP: <?php function test($string) { $word = '([а-я]+|[a-z]+)'; // регулярко на слово $separator = '[~_ !]'; // на разделитель слова $re = "#^$separator+$word($separator+$word)+$separator*$#"; // минимум, подопытный должен содержать слово. Разделенные не меньше одним разделителем, могут быть еще слова. $re .= 'i'; // любой регистр $re .= 'u'; // строки в UTF-8 $string = trim ($string); // убираем лишние пробелы слева и справа return (bool) preg_match($re, $string); } ?> Насколько правильно я думаю?
вы обязали (+) "украшать" начало первого слова и обязали использовать больше одного слова PHP: <? $re = "#^$separator*$word($separator+$word)*$separator*$#"; что бы быть уверенным, напишите проверки на все случаи
PHP: <? function test($string) { $separator = '[~_ !]'; // на разделитель слова // выражение на русском $word = '[а-я]+'; $ru = '$separator*$word($separator+$word)*$separator*'; // выражение на английском $word = '[a-z]+'; $en = '$separator*$word($separator+$word)*$separator*'; $re = "#^($ru|$en)$#"; $re .= 'i'; // любой регистр $re .= 'u'; // строки в UTF-8 $string = trim ($string); // убираем лишние пробелы слева и справа return (bool) preg_match($re, $string); } // требует проверок
в таком случае можно поступить гораздо проще: PHP: <? function test($string) { $separator = '~_ !'; // на разделитель слова $re = "#^([а-я$separator]+|[a-z$separator]+)$#"; $re .= 'i'; // любой регистр $re .= 'u'; // строки в UTF-8 $string = trim ($string); // убираем лишние пробелы слева и справа return (bool) preg_match($re, $string); }
Ti Вот теперь действительно все Не прошли проверку: ну и с англицкими словами waka вот -Hello- Good Ангел True программист Спасибо.
фигасе вы тут флудите че паритесь то? Код (Text): function check_name($string){ if(preg_match("#^([a-z\~\s\!_])$#i", $string)){ result:=true; }elseif(preg_match("#^([а-я\~\s\!_])$#i", $string)){ result:=true; }else{ result:=false; } }