Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Обработки строк


Автор: Aliance 8.4.2006, 18:58
Всем привет.

У меня возникла задача: необходимо проверить введенные пользователем данные в форуме на стороне сервера.

• Нужно проверить e-mail на валидность. Не подскажите как?
Прочел эти темы:
http://forum.vingrad.ru/index.php?showtopic=46596
http://forum.vingrad.ru/index.php?showtopic=55191&st=40
http://forum.vingrad.ru/index.php?showtopic=76143

Там больше спора, чем готового сформулированного ответа :-)

Кстати, что вы думаете на счет этого:
http://community.livejournal.com/ru_programming/47239.html?mode=reply

• нужно проверить дату на правильность. Я так понимаю, что нужно использовать функцию checkdate(), но там аргументы идут не в том порядке (мм, чч, гггг), в котором моя строка. Опять же, видимо, нужно регами строку привести к нужному виду?! Моя строка вида
гггг/мм/чч. Хотя при желании могу ее изменить на мм, чч, гггг, имхо, юзерам проще водить не в таком формате.

• проверить значение, на содержание в нем только чисел

• проверить с помощью регулярок на наличие любого символа в строке
Я так понимаю это [\w+] ?

Автор: ZlojEzh 8.4.2006, 19:44
1) уточни: проверить только представление емейла или точно узнать существует ли такой ящик?
2) если проверять просто формат:
Код

preg_match("#\d{4}/\d{2}/\d{2}#")

чтоб проверить существование такой даты:
Код

list{$year,$month,$day} = explode('/',$value);
if (checkdate($month, $day, $year)) {
  print "date correct\n";
} else {
  print "date incorrect\n";
}

3)
Код

preg_match("#^\d+$#",$value)

4)
Цитата(Aliance @ 8.4.2006, 18:58 Найти цитируемый пост)
наличие любого символа в строке

можешь не проверять - если она не пустая, то какой-то символ там есть ))
вообщем вопрос я не понял ))
вариант [\w+] - это вряд ли (означает один символ, образующий слово, или плюс)
скорее всего ты имел ввиду [\w]+ - один или более "словесных" символов

Автор: Aliance 8.4.2006, 20:05
Цитата(ZlojEzh @ 8.4.2006, 20:44 Найти цитируемый пост)
) уточни: проверить только представление емейла или точно узнать существует ли такой ящик?

Первое. Именно формат smile

Цитата(ZlojEzh @ 8.4.2006, 20:44 Найти цитируемый пост)
скорее всего ты имел ввиду [\w]+ - один или более "словесных" символов

Я пока ничего не имел ввиду, этот отрывок я взял с топика, ссылку на который дал выше от участника PARROT :-) И это только догадка...

Спасибо за ответы, в общем и целом помог. Надеюсь дашь ответ и на оставшиеся вопросы smile

Автор: ZlojEzh 8.4.2006, 20:23
тот длиннющий регексп для валидации емейла - изврат страшный
но именно так он и приведен в каком-то rfc (номер не помню)
использовать его для проверки введенных пользователем данных вряд ли стоит
сдается мне, что скорость такого рега оставляет желать лучшего

а вообще, сколько программеров - столько и вариаций проверки емейла
я вот сейчас такой накатал (правда не тестил):
#^[\w\d][\w\d_-]*@([\w\d][\w\d\_-]+\.)+[\w\d]{2,4}$#



а последний пункт объясни, все таки, по-подробнее
а то я совсем вопрос не понял (уж больно меня смутила фраза "наличие любого символа")

Автор: CyClon 8.4.2006, 20:28
Код
<?php

/* Mail check go */

function mail_check($email)
{
    if (preg_match("#^[a-zA-Z0-9_.\-]{3,50}@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,5}$#", $email)) {
        return 1;
    } else {
        return 0;
    }
}

echo (mail_check("MySuperMail-Dog_2@google.ru")) ? "Address is valid!" : "Sorry, invalid email address...";

/* Date check go */

function date_check($date)
{
    $temp1 = explode(".", $date);
    $temp2 = explode("/", $date);
    if (sizeof($temp1) == 3 || sizeof($temp2) == 3) {
        return 1;
    } else {
        return 0;
    }
}

echo (date_check("08/04/2006")) ? "Date is valid!" : "Date is invalid, sorry...";

/* Value is number check */

echo (is_numeric("72637812")) ? "String is number" : "Stirng is string...";

/* StrLen check */

echo (strlen("g") > 0)) ? "StrLen > 0, all ok" : "Error, string is null";

?>


Написал, но не проверял. Сервер что-то прилег...
Добавлено @ 20:33
Ребята, зачем гонять регулярки для проверки на пустоту строки, если можно воспользоваться strlen? Зачем их гонять для проверки число/не число, если можно использовать is_numeric?

Автор: Ciber SLasH 9.4.2006, 00:07
Вот ещё "мыльный" рег (взял из книжки):
Код

$e_mail_1 = 'yo.moyo@yandex.ru';
$e_mail_2 = 'yo_moyo@server.spb.ru';
if (preg_match("/^([-\w\d._]+@[-\w\d.]+(\.[-\w\d]+)+)*$/", $e_mail_2)) echo 'Мыло "'.$e_mail_2.'" прошло проверку.';
else echo 'Мыло "'.$e_mail_2.'" НЕ прошло проверку !!';

Автор: ZlojEzh 9.4.2006, 00:18
Код

Мыло "...@server.spb.ru" прошло проверку.
Мыло "-.--.-@server.spb.ru" прошло проверку.

что-то тут не так...

Автор: Ciber SLasH 9.4.2006, 01:00
Вот тут хорошие ссылки: http://forum.vingrad.ru/index.php?showtopic=75770
Вот ещё рег (взят со страницы по ссылки и переделан):
Код

$e_mail1 = 'yo_mo.yo@server.ru';
$e_mail2 = 'z_@yo.xx';
$e_mail3 = '_@_.xx';
$reg1 = '#((?:\w|\d){1}(?:\w|\d|\-|_|\.|\+)+?(?:\w|\d){1}@(?:(?:\w|\d){1,}(?:\-|\.){0,1}(?:\w|\d){1,})+?\.(?:\w){2,4})#';
$reg2 = '#([\w\d][\w\d\-_\.\+]*?@(?:[\w\d]+[\-\.]?[\w\d]+)+?\.\w{2,4})#';
echo 'Мыло "'.$e_mail2.(preg_match($reg2, $e_mail2) ? '"' : '" <b>НЕ</b>').' прошло проверку.';

Автор: Aliance 9.4.2006, 16:25
ZlojEzh, это значит в строке присутствует любой символ, кроме пробела. Думаю $str !== "" будет достаточно.
CyClon, Ciber SLasH, спасибо. пошел тестировать.

Автор: ZlojEzh 9.4.2006, 20:07
Цитата(Aliance @ 9.4.2006, 16:25 Найти цитируемый пост)
Думаю $str !== "" будет достаточно.

если кроме пробела, то надо делать так
Код

 if (trim($str)!='')




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)