Написал по примеру из книги вариант шаблона для проверки Email-ов: '([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})' Полный код страницы(posix.php): Код (Text): <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script> function BtnClick() { document.testform.submit(); } </script> </head> <body> <?php $EmailMask = '([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})'; $DataStr = ""; if(isset($_POST['EmailField'])) { $DataStr = $_POST['EmailField']; if(ereg($EmailMask,$DataStr)) { echo "$DataStr <br/>"; echo 'Прошло'; } else { echo "$DataStr <br/>"; echo 'Ошибка'; } } ?> <form name="testform" action="posix.php" method="post"> <input type="text" name="EmailField" size=30 value=<?php echo '"'.$DataStr.'"';?> /> <input type="button" name="BtnSubmit" value="Проверить" onclick="BtnClick();"/> </form> </body> </html> Вообщем возникло 2 проблемы: 1) Не корректно контролирует размер домена, проходят длинны 3,4,5, и.т.д. 2) Допускает адреса вида _1@1.rrr но 1_@1.rrr уже отсекает. В чем тут может быть дело?
posix регэкспы в php считаются устаревшими, юзайте pcre. а проблема скорее всего в том, что отсутствуют ограничители строки, в pcre это пара ^, $ для начала и конца строки, как оно в posix не знаю.
Кхм, если я не ошибаюсь, то в POSIX вообще не существует такого понятия, как ограничители (на равне с жадностью). Отсюда и появились функции, наподобии eregi, eregi_replace, поскольку в PCRE ограничители существуют только из-за возможности указания флагов, а в POSIX их просто нет.
Ну а всё таки они там есть. Код (Text): sergey89@thelogin ~> php -r 'var_dump(ereg("^([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})\$", "_1@1.rrr"));' int(0)
Странно все это. Ладно бы еще я сам что-то придумал... Но этот пример я беру из книжки "PHP5 полное руководство" автор Джон Коггзолл. Глава 3. Регулярные выражения. Подраздел POSIX. Вставляю пример из книги в свой код и получаю то, что написано в первом посте. Видимо с момента издания его книги (2005) что то поменялось в PHP в обработке регулярных выражений?
Насчет первого вопроса извиняюсь, сам тупанул. Все правильно работает. Хотя со вторым вопросом все аналогично. Он корректно находит выделяет из неправильного емайла правильный, и сообщает что типа нашел. Т.е. например обрабатывая строку __Abc@abc.12345 функция находит в ней правильный адрес Abc@abc.123 и возвращает истину, а лишнии символы отрубает. Вообщем надо как-то жестко фиксировать первый и последний символ, что бы шаблон работал более корректно.
Угу, спасибо за подсказку, я просто сразу не просек фишку, зачем делать акценты на первый и последний символы, если на них вроде как не вводились дополнительные ограничения. Но теперь разобрался. Всем большое спасибо.