Jump to content
  • 0

Помогите допилить регулярное выражение '(


koly32
 Share

Question

Здравствуйте. Нужно проверить логин пользователя, а т.к. логин будет использоваться еще и в url (будет личный кабинет пользователя) то  требования к логину "самые жесткие":

1 только латинские буквы или цифры , а так же допускаются знаки  _.-

2 не может начинаться с _.- и заканчиваться соответственно тоже

3 не могут повторятся символы подряд например -- или -_ или -. и т.п.

 

Ниже составленная мною регулярка прекрасно проверяет такие вот примерно логины:

SuperNic или Super-Nic

Вот если нужно так к примеру то не пропускает:  

S-u_p-e-r.Nic

Понимаю что эта регулярка должна повторятся как-бы что ли чтобы знаки с буквами тоже могли повторятся по требованиям выше представленных трех важных пунктов. Но как это сделать '(? как сделать чтобы такой вот логин мог проходить:

S-u_p-e-r.Nic

 

$NoStop = "/^[a-zA-Z0-9]+([_.-]{0,1})[a-zA-Z0-9]+$/";

Edited by koly32
Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0
Теперь столкнулся с другой проблеммой '(

В файле .htaccess у меня прописано так:

 

RewriteCond %{REQUEST_URI} /+[^\.]+$

RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

 

Эти строчки ставят слэш / в конце url и ели в конце .html то слеш / не ставится. Т.е. изначально если так:

site.ru/S-u_p-e-rNic

то после:

site.ru/S-u_p-e-rNic/ 

 

Казалось бы все нормально НО если в url (в данном случае в логине который является частью url) присутствует точка . то слеш / на конце url не ставится.

Случайно обнаружил эту ошибку. Можно отказаться конечно от точки . в логине (который является частью url) но мне бы хотелось чтобы точку все же можно было ставить. Пробовал еще такой вариант он работает как и выше представленный и также отказывается ставить слеш на конце url если в url присутствует точка.

 

RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)

RewriteRule .* %1/ [R=301,L]

 

Помогите пожалуйста дописать в один из этих кодов чтобы если есть точка . в url то в конце url ставился бы слеш / (если в конце url .html то слеш / не нужно) Если в регулярном выражении функции preg_match файла php я еще мог чего-то допилить то в файле .htaccess не получается. '(

Edited by koly32
Link to comment
Share on other sites

  • 0
1 только латинские буквы или цифры , а так же допускаются знаки _.- 2 не может начинаться с _.- и заканчиваться соответственно тоже 3 не могут повторятся символы подряд например -- или -_ или -. и т.п.

 

1. спецсимволов можно и больше разрешить

2. странное требование

3. тоже странное требование

 

Дальнейшей возни с регулярками и редиректами я вообще не понимаю, можно сделать все намного проще и понятнее.

  • Like 1
Link to comment
Share on other sites

  • 0

 

1 только латинские буквы или цифры , а так же допускаются знаки _.- 2 не может начинаться с _.- и заканчиваться соответственно тоже 3 не могут повторятся символы подряд например -- или -_ или -. и т.п.

 

1. спецсимволов можно и больше разрешить

2. странное требование

3. тоже странное требование

 

Дальнейшей возни с регулярками и редиректами я вообще не понимаю, можно сделать все намного проще и понятнее.

 

Смотрел регистрацию на других популярных сайтах. Там в большинстве даже точку нельзя поставить) А вообще наткнулся вот на эту статью http://habrahabr.ru/post/40618/ У меня получается интеграция с CMS только что на свой движок. Ресурс тоже авторитетный вроде как) у меня опыта нет почти. поэтому я пытаюсь сделать чтобы переделывать потом много не пришлось.

Если сейчас я думаю как с одной точкой в url разобраться, то что будет если разрешить больше спецсимволов)) Может наоборот тогда пробовать убрать слеш /  или на худой конец .html добавить (.html я могу добавить)?

 

Будет или так: 

site.ru/S-u_p-e-r.Nic

или так:

site.ru/S-u_p-e-r.Nic.html

а желательно все же так '(:

site.ru/S-u_p-e-r.Nic/ - куда лучше выглядит)

Edited by koly32
Link to comment
Share on other sites

  • 0

А разве так можно чтобы символы могли повторятся друг за другом и чтобы логин начинался ну и заканчивался этими символами? Судя по ответу " 2. странное требование 3. тоже странное требование" то можно)

Латинских символов ведь очень много получается их все можно использовать??? 

https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D1%82%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D1%84%D0%B0%D0%B2%D0%B8%D1%82_%D0%B2_%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4%D0%B5

Link to comment
Share on other sites

  • 0

А зачем вообще проверять на .html и / ?

 

Если изначально формируется адрес у тебя в скрипте, ты и формируй его

А если пользователь введет

http://site.my/Vasya.Pupkin-99.html

это уже его проблема, сайт должен выдать 404 ошибку.

 

Так для примера взять тот же ВКонтакте, если вы введете адрес http://vk.com/id94737то попадете на страницу пользователя, а если http://vk.com/id94737/ то получите 404 ошибку


А разве так можно чтобы символы могли повторятся друг за другом и чтобы логин начинался ну и заканчивался этими символами?

 

а почему нет?


Латинских символов ведь очень много получается их все можно использовать???

нет не все, к примеру / ? # использовать в адресе у вас не выйдет, ну и конечно совсем все наверное не стоит, но чтук 6-7 вполне можно подобрать для разнообразия, к примеру -+=_.@$~

  • Like 1
Link to comment
Share on other sites

  • 0
А зачем вообще проверять на .html и / ?

 

У меня на сайте все url заканчиваются слешем /  (Настройка такая в файле .htaccess о чем выше писал) т.е. site.my/article/ или site.my/section/ именно поэтому я хотел добавить слеш / в конце url где частью url является логин т.е. чтобы так было site.my/Vasya.Pupkin-99/  (стандартно везде чтобы было), а поскольку из-за точки . в логине который является частью url на конце слеш / не ставится  (нужно допиливать пару строчек в файле .htaccess о чем тоже писал выше), а мне нужно чтобы везде было со слешем я принял решение):

 

1 Убрал все слеши / на конце url. Прописал в файле .htaccess : 

 

RewriteCond %{HTTP_HOST} (.*)

RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
 
изначально было так. убрал:
 
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
 
2 Добавил в регулярку для логина еще разрешенных символов:
 
$NoStop = "/^[a-z0-9\_\-\+\@\$\~\.\=]{3,20}$/i";
 
Теперь эти требования отменяются:

1 только латинские буквы или цифры , а так же допускаются знаки  _.-

2 не может начинаться с _.- и заканчиваться соответственно тоже

3 не могут повторятся символы подряд например -- или -_ или -. и т.п.

 
Логин может быть от 3 до 20 символов и латинских букв и быть хоть таким: site.my/--~-_@_.= что опять же не очень хорошо наверно.
 
Ну что же я решил проблему со слешем на конце url просто убрав его.
 
А над такой допустимостью символов даже латинских в логине который будет в url еще надо подумать. Даже регистр букв важен вроде как..Т.е. site.my/Vasya.Pupkin-99 и site.my/vasya.pupkin-99 Могут восприниматься поисковиками как разные страницы. Об этом пишут в инете. Что вы думаете по этому поводу?
 
Edited by koly32
Link to comment
Share on other sites

  • 0
Логин может быть от 3 до 20 символов и латинских букв и быть хоть таким: site.my/--~-_@_.= что опять же не очень хорошо наверно.

 

А вам то какая разница какой будет логин? Вы же не ФИО просите, а логин на то и логин.

 

 

 

Ну что же я решил проблему со слешем на конце url просто убрав его.

 

сразу так и нужно было )

 

 

 

А над такой допустимостью символов даже латинских в логине который будет в url еще надо подумать. Даже регистр букв важен вроде как..Т.е. site.my/Vasya.Pupkin-99 и site.my/vasya.pupkin-99 Могут восприниматься поисковиками как разные страницы. Об этом пишут в инете. Что вы думаете по этому поводу?

 

Можете, к примеру, при регистрации разрешить создание логина только в одном регистре.

 

Или создавать логин разрешить в любом регистре, но при регистрации смотреть в базе нет ли уже такого логина в любом регистре и если есть не давать регистрироваться, но при всем при этом генерировать ссылки на профиль в нижнем регистре, то есть:

 

В базе есть логин Vasya-99

Другой человек регистрируется под логином VASya-99 , и вы говорите ему что данный логин уже занят.

Ссылку на профиль Vasya-99 генерируете как site.ru/vasya-99, то есть переводите все ссылки в нижний регистр чтобы не путаться с регистрами.

  • Like 1
Link to comment
Share on other sites

  • 0
Можете, к примеру, при регистрации разрешить создание логина только в одном регистре.

Не очень хорошо для пользователя) 

 

 

В базе есть логин Vasya-99 Другой человек регистрируется под логином VASya-99 , и вы говорите ему что данный логин уже занят.

У меня так реализовано)

 

 

Ссылку на профиль Vasya-99 генерируете как site.ru/vasya-99, то есть переводите все ссылки в нижний регистр чтобы не путаться с регистрами.

Так и сделаю. А что если пользователь поставит где-нибудь ссылку на мой сайт в "не правильном" регистре т.е. site.ru/Vasya-99  и поисковики проиндексируют эту "не правильную" ссылку? получается с точки зрения поисковиков site.ru/Vasya-99 и site.ru/vasya-99 это две разные ссылки которые ведут на одну страницу site.ru/vasya-99 ? Судя потому как я это понял то да) А чтобы избежать дубля нужно похоже делать 301 редирект в файле .htaccess (Получается из-за верхнего регистра как бы две проблемы 1 поисковики 2 хостинг на котором сайт)

 

на одном из форумов нашел:

 

Будте внимательны к регистру.

Короче говоря, если вы используете серверы / IIS Microsoft, то все в шоколаде. Но если вы поклонник Linux/UNIX, то проблем не избежать, поскольку они по разному интерпретируют регистр и randswhisky.com/AbC будет совсем не тоже самое что randswhisky.com/aBc. 

54eab252178055.56686508.gif

Идеальным решение будет если неверный регистр в урле будет автоматически редиректиться/канонизироваться на правильный урл. Есть специальный htaccess который может помочь в этом. Вот этот сайт

 

Если честно то не очень то хочется добавлять в .htaccess столько строк. Хоть как я понял из перевода там сказано, что они сильно тормозить систему не будут, но все же:

 

RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

RewriteRule ![A-Z] -

 

RewriteRule ^([^A]*)A(.*)$ $1a$2

RewriteRule ^([^B]*)B(.*)$ $1b$2

RewriteRule ^([^C]*)C(.*)$ $1c$2

RewriteRule ^([^D]*)D(.*)$ $1d$2

RewriteRule ^([^E]*)E(.*)$ $1e$2

RewriteRule ^([^F]*)F(.*)$ $1f$2

RewriteRule ^([^G]*)G(.*)$ $1g$2

RewriteRule ^([^H]*)H(.*)$ $1h$2

RewriteRule ^([^I]*)I(.*)$ $1i$2

RewriteRule ^([^J]*)J(.*)$ $1j$2

RewriteRule ^([^K]*)K(.*)$ $1k$2

RewriteRule ^([^L]*)L(.*)$ $1l$2

RewriteRule ^([^M]*)M(.*)$ $1m$2

RewriteRule ^([^N]*)N(.*)$ $1n$2

RewriteRule ^([^O]*)O(.*)$ $1o$2

RewriteRule ^([^P]*)P(.*)$ $1p$2

RewriteRule ^([^Q]*)Q(.*)$ $1q$2

RewriteRule ^([^R]*)R(.*)$ $1r$2

RewriteRule ^([^S]*)S(.*)$ $1s$2

RewriteRule ^([^T]*)T(.*)$ $1t$2

RewriteRule ^([^U]*)U(.*)$ $1u$2

RewriteRule ^([^V]*)V(.*)$ $1v$2

RewriteRule ^([^W]*)W(.*)$ $1w$2

RewriteRule ^([^X]*)X(.*)$ $1x$2

RewriteRule ^([^Y]*)Y(.*)$ $1y$2

RewriteRule ^([^Z]*)Z(.*)$ $1z$2

 

RewriteRule [A-Z] - [N]

 

RewriteCond %{ENV:HASCAPS} TRUE

RewriteRule ^/?(.*) /$1 [R=301,L]

 

 

Ну или если в файл httpd.conf то это. Работает быстрее опять же насколько я понял из перевода:

 

RewriteMap lowercase int:tolower

RewriteCond $1 [A-Z]

RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]

 

Чем дальше тем не веселее мягко говоря'(

WWT Скажите пожалуйста что Вы об этом думаете?

Edited by koly32
Link to comment
Share on other sites

  • 0
Так и сделаю. А что если пользователь поставит где-нибудь ссылку на мой сайт в "не правильном" регистре т.е. site.ru/Vasya-99 и поисковики проиндексируют эту "не правильную" ссылку? получается с точки зрения поисковиков site.ru/Vasya-99 и site.ru/vasya-99 это две разные ссылки которые ведут на одну страницу site.ru/vasya-99 ? Судя потому как я это понял то да) А чтобы избежать дубля нужно похоже делать 301 редирект в файле .htaccess (Получается из-за верхнего регистра как бы две проблемы 1 поисковики 2 хостинг на котором сайт)

 

=) А что если я сейчас наделаю 100500 неверных ссылок на твой сайт, тебя это будет волновать? Не должно, ты с чистой совестью на все неверные сылки должен отдавать 404 ошибку, вот и все.

 

Изначально ссылку на профиль генерирует твой скрипт, и только он является достоверным источником правильности =) Все остальное в помойку. Самое главное не позволяй сам дублей, а сделав редиректы с неверных ссылок на верную ты по сути говоришь поисковикам что все эти ссылки вполне реальные и рабочие, хоть и с редиректом.

 

 

Если честно то не очень то хочется добавлять в .htaccess столько строк. Хоть как я понял из перевода там сказано, что они сильно тормозить систему не будут, но все же:

 

Это тупость подстраиваться под то как пользователь по памяти будет набирать адрес страницы. Не пользователь создает правила пользования сайтом, а владелец. Поэтому просто следуй своим правилам.

Link to comment
Share on other sites

  • 0
Изначально ссылку на профиль генерирует твой скрипт, и только он является достоверным источником правильности =) Все остальное в помойку.

Действительно можно сделать простенькую проверку url типа:

 

if(preg_match("/[A-Z]/",$_SERVER['REQUEST_URI'],$rVG)){

header("HTTP/1.0 404 Not Found");

}

 

Прописав эти строчки в index.php в самом верху (опять же в зависимости как реализован движок) Тогда железно все в верхнем регистре в помойку 404 и все странички сайта  будут открываться исключительно если запрос на них был в нижнем регистре.

 

НО Помогите разобраться все таки а)

 

=) А что если я сейчас наделаю 100500 неверных ссылок на твой сайт, тебя это будет волновать? Не должно, ты с чистой совестью на все неверные сылки должен отдавать 404 ошибку, вот и все.

Ясно. И логично) а вот если  взять к примеру  сайт htmlbook.ru  там при переходе к примеру на htmlbook.ru/html/audio мы попадаем на htmlbook.ru/html/audio если htmlbook.ru/html/AuDio мы попадаем на htmlbook.ru/html/AuDio причем загружается одна и та же страница.  При этом 404 ошибка не выдается. Или она ошибка 404 выдается роботу но пользователю все-таки загружается страница?? Или все-таки ошибка 404 не выдается и страница загружается вне зависимости от верхнего регистра а на поисковики можно подзабить??

 

 

Это тупость подстраиваться под то как пользователь по памяти будет набирать адрес страницы. Не пользователь создает правила пользования сайтом, а владелец. Поэтому просто следуй своим правилам.

Если взять vk.com то здесь к примеру при переходе на vk.com/article или vk.com/ArtiCle мы попадаем на одну и туже страницу (причем ошибка 404 не выдается) НО в url  регистр тот с которым страница изначально например vk.com/ArtiCle Получается в vk.com регистр букв в url реализован путем редиректа  301 на правильную страницу причем как бы с правильным регистром?? Получается vk.com подстроились все-таки под пользователя) ? (Хотя если на конце слеш / то  vk.com "как не правильный" и не подстроенный под пользователя выдает 404 хотя можно и 301 редирект на страницу без слеша)) 

 

 

Самое главное не позволяй сам дублей, а сделав редиректы с неверных ссылок на верную ты по сути говоришь поисковикам что все эти ссылки вполне реальные и рабочие, хоть и с редиректом.

Ясно.

 

WWT извините конечно что столько вопросов. Просто хочу разобраться в этом раз и навсегда. Чувствую уже что истина где-то рядом))

Edited by koly32
Link to comment
Share on other sites

  • 0
Прописав эти строчки в index.php в самом верху (опять же в зависимости как реализован движок) Тогда железно все в верхнем регистре в помойку 404 и все странички сайта будут открываться исключительно если запрос на них был в нижнем регистре. НО Помогите разобраться все таки а)

 

Я бы генерировал ссылку на профиль на этапе регистрации и сохранял её в БД, а при запросе к сайту если ссылка является ссылкой на профиль то проверял бы в базе есть такая или нет, если нет отдавал бы 404, если есть то выдавал бы нужный контент.

 

Вам изначально нужно как то определять является ли запрошенный адрес профилем или это страница сайта, к примеру у вконтакта по умолчанию ссылка на профиль пользователя генерируется как:

http://site.my/id12345

То есть они ставят 'id' в начале и добавляют id пользователя после, по этой контрольной подстроке можно определить что эта ссылка является ссылкой на профиль.

что-то типо:

/^id[0-9]+$/

Плюс у них же в настройках профиля можно задать псевдоним для ссылки, а вот он при сохранении проверяется в БД, и если такой уже у кого-то есть (или у страницы сайта) то выдаст ошибку пользователю.

 

 

 

Ясно. И логично) а вот если взять к примеру сайт htmlbook.ru там при переходе к примеру на htmlbook.ru/html/audio мы попадаем на htmlbook.ru/html/audio если htmlbook.ru/html/AuDio мы попадаем на htmlbook.ru/html/AuDio причем загружается одна и та же страница. При этом 404 ошибка не выдается. Или она ошибка 404 выдается роботу но пользователю все-таки загружается страница?? Или все-таки ошибка 404 не выдается и страница загружается вне зависимости от верхнего регистра а на поисковики можно подзабить??

 

Я не знаю на чем и как написан htmlbook.ru но как вариант там адрес приводится к определенному регистру, а уж потом проверяется, либо как вы писали выше, либо в php, это не важно. Я бы так делать не стал скорее всего(может быть я в этой част и не прав, это нужно спрашивать у SEOшников, может кто-то из ребят на форуме подскажет детальнее, но с технической точки зрения это не важно). Суть в том что часть пути в URI по стандарту может быть регистрозависимой, это зависит от реализации, да и от файловой системы может зависеть. Как реализовывать решать тебе.

 

 

 

Если взять vk.com то здесь к примеру при переходе на vk.com/article или vk.com/ArtiCle мы попадаем на одну и туже страницу (причем ошибка 404 не выдается) НО в url регистр тот с которым страница изначально например vk.com/ArtiCle Получается в vk.com регистр букв в url реализован путем редиректа 301 на правильную страницу причем как бы с правильным регистром?? Получается vk.com подстроились все-таки под пользователя) ? (Хотя если на конце слеш / то vk.com "как не правильный" и не подстроенный под пользователя выдает 404 хотя можно и 301 редирект на страницу без слеша))

Да ты прав у них редирект явный, видимо сделано для удобства пользователей, вдруг человек набирал адрес и забыл выключить капс, как вариант.

 

 

 

Просто хочу разобраться в этом раз и навсегда. Чувствую уже что истина где-то рядом))

разберешься )

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy