Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Регулярные выражения PHP (https://javascript.ru/forum/server/28984-regulyarnye-vyrazheniya-php.html)

kilogram 09.06.2012 19:31

Регулярные выражения PHP
 
Читаю Котерова "Регулярные выражения".
Там пишут что \w - любая буква или цифра.
Написал такой код:
<form action="index.php" method="post">
<input type="text" name="username"/>
<input type="submit" value="Отправить" />
</form>
<?php 
///[a-zA-Z]+-[a-zA-Z]/
// preg_match("шаблон_поиска", "строка_в_которой_проводится_поиск", массив_с_результами_поиска) 
if(isset($_POST['username']))
$user = $_POST['username'];
else { $user = ''; exit;}
echo $user.'<br>';


if(preg_match("/\\w/", $user)) { 


    echo "Имя пользователя задано в правильном формате"; 
} else { 
    echo "Имя пользователя задано в <b><font color='red'>неправильном формате</font></b>";  
} 

?>

Почему не работает кирилица в \w?

2. Там пишут что есть выражения, которые определяют группу символов.
пишу так:
if(preg_match("/[[:alpha:]]/", $user)) {

определяет только латиницу почему то

3. Пишут что знак "*" соответствует 0 или больше символов, пишу так
/a-*-/

а затем ввожу одну букву, выдает ошибка, оказывается нужно 1 и более, а не ноль и более.

4.http://s2.ipicture.ru/uploads/20120609/6Sdxdkh1.jpg
Пробую так:
if(preg_match("/a{1}/", $user)) {

хоть напишу один раз или 10 раз букву "а" выдает что верно, хотя здесь ограничитель в один раз
Пишу так:

if(preg_match("/a{1,2}/", $user)) {

Букву "а" согласно данному выражению я могу вводить от 1-2 раз, ввожу 10 раз букву "а" и выдает что верно

5. Пишут что если знак "?"(квантификатор), перед ним символ может повторятся только 0 или 1 раз(но не более!).
Пишу такой код:
if(preg_match("/a?/", $user)) {

Ввожу 10 раз букву а латинскую и выдает что верно.

Если кто может, объясните вот эти действия почему так и также почему не работет кирилица. Заранее благодарю.

devote 09.06.2012 19:35

все должно работать с кириллицой.. просто используйте кодировку UTF-8 а не CP-1251 и все будет чудесно работать

kilogram 09.06.2012 19:52

Изменил кодировку в Ютф-8 и сам файл перекодировал в Ютф-8 и ничем не помогло.

devote 09.06.2012 20:07

Цитата:

Сообщение от kilogram
if(preg_match("/a{1}/", $user)) {

если хоть одну букву a найдет, то все гуд, не важно сколько вы их вбили
Цитата:

Сообщение от kilogram
if(preg_match("/a{1,2}/", $user)) {

тоже что и верхнее правило, одна или две
Цитата:

Сообщение от kilogram
if(preg_match("/a?/", $user)) {

найдет a или не найдет, все прокатет.. а вбить можете хоть миллион, если он хоть одно вхождение найдет или вообще не найдет то все гуд.

Могу лишь посоветовать вам дочитать книгу до конца, а потом пытаться разобраться. Потому как вы не все поняли из книги, или просто не дочитали ее до конца, либо книга плохая.

Serg_pnz 09.06.2012 21:08

1. \\w зачем тут два слеша?
2. При утф8 надо использовать модификатор u (или большая U - всё время путаюсь, но вроде как маленькая)

devote 09.06.2012 21:21

Цитата:

Сообщение от Serg_pnz
2. При утф8 надо использовать модификатор u (или большая U - всё время путаюсь, но вроде как маленькая)

при UTF-8 не обязательно юзать этот модификатор. И без него PHP понимает с какой кодировкой нужно работать. В ранних версиях PHP да нужно было юзать модификатор, сейчас уже не нужно/не обязательно.

Aetae 09.06.2012 22:46

Ну и в догонку:
Цитата:

3. Пишут что знак "*" соответствует 0 или больше символов, пишу так
/a-*-/
Расшифровка:
Любое количество любых символов,
затем один символ "а",
затем ноль или больше символов "-",
затем один символ "-",
затем любое количество любых символов.

Те, просто "а", не подходит, тк после него обязательно должен быть "-".

SkyLight 13.06.2012 19:19

В крайнем случае можно указать интервал [а-я], должно работать.


Часовой пояс GMT +3, время: 12:23.