Nickolay.info . JavaScript . Кодуємо адресу E-mail і оцінюємо валідність URL через JavaScript
- Як засобами JavaScript захистити адреса E-mail від сканування?
- Як скриптом перевірити валідність E-mail і / або URL-адреси?
Спочатку відповімо на друге питання, як більш простий. Починаючи з версії 1.2 JavaScript, подібно Perl'у і PHP, підтримує Регулярні вирази . Хоча перевірка повної специфікації адреси E-mail або URL - справа досить трудомістка, в 99% випадків можна обійтися нескладними виразами на кшталт
^ [_. 0-9a-z -] + @ ([0-9a-z] [0-9a-z _-] +.) + [Az] {2,4} $ - для E-mail; / ^ (? :( ?: https? | Http | ftp): \ / \ / (?: [A-z0-9 _-] {1,32} (? :: [a-z0-9 _-] {1 , 32})? @)?)? (?: (?: [a-z0-9 -] {1,128} \.) + (?: com | net | org | mil | edu | arpa | ru | gov | biz | info | aero | inc | name | [az] {2}) | (?! 0) (? :( ?! 0 [^.] | 255) [0-9] {1,3} \.) {3} (?! 0 | 255) [0-9] {1,3}) (?: \ / [a-z0-9., _ @% &? + = \ ~ \ / -] *)? (?: # [^ \ '\ "&] *)? $ / i - для URL; / (^ \ s +) | (\ s + $) / g - для видалення зайвих пробілів, оскільки стандартної функції для цього немає;Зауважу, що якщо малі та великі літери обробляються Вашими серверами як різні, а Ви хочете писати адресу саме [email protected], а не [email protected], перевірка допустимості адреси E-mail набуде вигляду
^ [_. 0-9A-Za-z -] + @ ([0-9A-Za-z] [0-9A-Za-z _-] +.) + [A-Za-z] {2,4 } $- ну і інші регулярні вирази можна змінити аналогічним чином.
Залишається підготувати необхідні функції:
<Script type = "text / javascript"> function trim (string) {// Видаляємо зайві прогалини з рядка return string.replace (/ (^ \ s +) | (\ s + $) / g, ""); } Function validEmail (mail) {// Перевіряємо коректність адреси пошти return (new RegExp ( "^ [_. 0-9a-z -] + @ ([0-9a-z] [0-9a-z _-] +. ) + [az] {2,4} $ "). test (mail)? 1: 0); } Function validURL (url) {// Перевіряємо коректність URL-адреси з протоколом https, http або ftp var template = / ^ (? :( ?: https? | Http | ftp): \ / \ / (?: [A- z0-9 _-] {1,32} (? :: [a-z0-9 _-] {1,32})? @)?)? (?: (?: [a-z0-9 -] {1,128 } \.) + (?: com | net | org | mil | edu | arpa | ru | gov | biz | info | aero | inc | name | [az] {2}) | (?! 0) (?: (?! 0 [^.] | 255) [0-9] {1,3} \.) {3} (?! 0 | 255) [0-9] {1,3}) (?: \ / [a-z0-9., _ @% &? + = \ ~ \ / -] *)? (?: # [^ \ '\ "& <>] *)? $ / i; var regex = new RegExp (template); return (regex.test (url)? 1: 0);} </ script>Якщо Ви хочете дозволити як коректні й нові кириличні URL-адреси, такі як чогось то.рф, вираз для перевірки URL можна трохи змінити, написавши замість виразу a-z0-9_- вираз a-zа-я0-9_- (якщо працюєте в кодуванні Windows-1251, зверніть увагу, що заміну доведеться зробити двічі), а в списку доменів дозволити домен .рф: замість inc | name в вираженні буде рядок inc | name | рф
Тепер перейдемо до основного питання - приховану засобами JavaScript свого ящика від спамерів. Найпростіше рішення цього завдання - написати замість адреси щось на зразок pers [AT] mail.ru, але нам хотілося б, щоб за посиланням можна було клацнути. Відомо чимало способів реалізувати на JavaScript базові алгоритми шифрування -
- проте, що породжується ними код досить складний і вимагає окремої генерації паролів і ключів, зберігати або передавати які ми не збираємося.
Замість цього ми сгенерируем цифровий код функцією виду
function Generate (mail) {var =; if (mail == "") {window.alert ( "Адреса E-mail порожній!"); return; } If (! ValidEmail (mail)) {window.alert ( "Адреса E-mail неваліден!"); return; } Var result = "", c; for (var k = 0; k <mail.length; k ++) {c = mail.charCodeAt (k); if (cяка поверне рядок result, що складається з цифр. Тут передбачається, що адреса переданий параметром mail, а результат записаний в текстове поле з ім'ям result, що відноситься до форми genform.
Написавши просту зворотну функцію зі строковим параметром s function GetEmail (s) {var code = ""; for (var k = 0; k <s.length; k + = 3) {code = String.fromCharCode (s.substring (k, k + 3)) + code; } Window.open ( "mailto:" + code); }
ми зможемо отримати з "зашифрованої" рядки s вихідний E-mail code, як в цьому посиланню для мого ящика [email protected]:
Відправити пошту (Адреси немає ні в коді сторінки, ні в статусному рядку браузера)
Для генерації "кодів" зручніше винести всі потрібні функції в окремий файл:
genmailcode.js (Genmailcode.js, 2 КБ)
і підключити його тегом виду <script type = "text / javascript" src = "genmailcode.js"> </ script>
до форми на зразок наступної: <form name = genform> <p> Адреса E-mail: <input type = text name = mail size = 30 maxlength = 30> </ p> <p> Код: <input type = text name = result size = 60 maxlength = 180> </ p> <p> <input type = button value = "Закодувати E-mail" onClick = "javascript: Generate (trim (document.genform.mail.value))"> <input type = button value = "Розкодувати Email" onClick = "javascript: Email (document.genform.result.value)"> </ p> </ form>
Тепер, маючи в затишному місці такий скриптик, можна включати в потрібні документи посилання на скрипт
getemail.js (Getemail.js, 1 Кб),
містить однойменну функцію.
Подивитися всі разом в роботі можна в формах нижче.
Для тих небагатьох в наш час користувачів, які відключають JavaScript або мають не підтримує його браузер, може стати в нагоді тег noscript, доданий після скрипта. Щоб хитрий робот не дістав E-mail звідти, його слід "замаскувати" додатковими тегами, в найпростішому випадку так: Моя адреса: [email protected]
- скопіюйте і вставте цю адресу - <script type = "text / javascript" src = "getemail.js"> </ script> <noscript> <center> Моя адреса: pers <code> @ </ code> mail.ru < br> <small> - скопіюйте і вставте цю адресу - </ small> </ center> </ noscript> <br> <a href="javascript:GetEmail('117114046108105097109064115114101112')"> Відправити пошту </a>
Нарешті, Javascript-захист можна взагалі зробити "по-старому", просто розбивши адреса на частини і потім програмно зібравши: <script type = "text / javascript"> user = 'pers'; site = 'mail.ru'; document.write ( '<a href=\"mailto:' + user +'@' + site +'\">' + user + '@' + site + '</a>'); </ Script>
Вийде звичайна на вигляд посилання:, але типовий парсер, який шукає в тілі документа адреси пошти, навряд чи вже її "побачить".
Частина 2, дописана пізніше (Ще трохи про захист адрес E-mail від ботів)
У першій частині я давав лише свої власні рекомендації, а методів захисту адреси E-mail можна придумати набагато більше, ніж там описано.
Перелічимо основні з них, приводячи всюди в приклад мою адресу ur.liam@srep (до речі, саме цей рядок з адресою теж захищена, в HTML-исходнике сторінки її немає)
Яваскрипт: щось на зразок такого -
<Script type = "text / javascript"> <! - var email = "pers"; var emailHost = "mail.ru"; var title = email + "@" + emailHost; document.write ( "<a href=" + "mail" + "to:" + email + "@" + emailHost+ ">" + title + "</a>"); // -> </ script>або як в статті за посиланням вище.
Недолік - нічого не відбудеться з Javascript відключений (менше 1% користувачів, але все ж ...)
Можна перегнати все в Юнікод ... як Вам така ссилочку?
<A href = "mailto: & # 112; & # 101; & # 114; & # 115; & # 064; & # 109; & # 097; & # 105; & # 108; & # 046; & # 114 ; & # 117; "> & # 112; & # 101; & # 114; & # 115; & # 064; & # 109; & # 097; & # 105; & # 108; & # 046; & # 114 ; & # 117; </a>Недолік - сучасні боти вже вміють читати Юнікод, а ось деякі застарілі браузери - ще немає.
Ще простіше перегнати в Юнікод тільки "собаку", часом і цього досить.
<a href="mailto:pers@mail.ru"> pers & # 064; mail.ru </a>Зрозуміло, що ризик "виявлення" ящика ботом в цьому випадку зростає.
А може, просто додати прихований текст десь перед собакою?
pers <span style = "display: none"> 635 </ span> @ mail.ruПростенько, мало виявленню ботом, але, на жаль, без посилання, адреса електронної пошти виведеться тільки текстом.
Якщо Вас влаштовує адресу "тільки текстом", можна обійтися в коді і коментарями HTML:
pers <! -> @. -> @ <! -> @. -> mail.ruА навіщо переганяти обов'язково в Юнікод, можна ж і просто в 16-ковий числа?
<a href="mailto:%70%65%72%73%40%6d%61%69%6c%2e%72%75"> мій E-mail </a>Недолік - я особисто був не рад бачити всі ці% 40 і% 2E в статусному рядку браузера.
Технологія CSS теж може дещо дати для захисту "мила" від жадібних і злодійкуватих спам-ботів:
<Style> span.obfemail: after {content: "[email protected]"; } </ Style> <span class = "obfemail">: </ span>На жаль, це теж "тільки текст", і не факт, що буде працювати в Internet Explorer (вірніше, точно не буде).
Ще один варіант CSS-захисту:
<Style> span.codedirection {unicode-bidi: bidi-override; direction: rtl; } </ Style> <span class = "codedirection"> ur.liam@srep </ span>А ось це вже кросбраузерності, у мене в IE8, по крайней мере, спрацювало.
Ну добре, скажете Ви, а як мені все це застосувати для свого "мила" або швидко отримати для нього потрібний код?
Є й такий варіант, ось посилання:
http://www.tools4noobs.com/online_tools/obfuscate_email/
Ну а якщо знаєте або придумали ще якийсь спосіб - пишіть :)
Як скриптом перевірити валідність E-mail і / або URL-адреси?
A-z -] + @ ([0-9a-z] [0-9a-z _-] +.) + [Az] {2,4} $ - для E-mail; / ^ (? :( ?: https? | Http | ftp): \ / \ / (?: [A-z0-9 _-] {1,32} (? :: [a-z0-9 _-] {1 , 32})?
@)?
@% &?
Quot;&] *)?
Test (mail)?
@)?
@% &?
Quot;& <>] *)?