За последние 24 часа нас посетил 21531 программист и 1692 робота. Сейчас ищет 1821 программист ...

POSIX, несколько непонятных моментов.

Тема в разделе "Регулярные выражения", создана пользователем Phantik, 16 июл 2009.

  1. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Написал по примеру из книги вариант шаблона для проверки Email-ов:
    '([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})'

    Полный код страницы(posix.php):
    Код (Text):
    1.  
    2. <html>
    3. <head>
    4.   <title></title>
    5.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    6. <script>
    7. function BtnClick()
    8. {  document.testform.submit(); }
    9. </script>
    10. </head>
    11. <body>
    12. <?php
    13. $EmailMask = '([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})';
    14. $DataStr = "";
    15. if(isset($_POST['EmailField']))
    16. {
    17.     $DataStr = $_POST['EmailField'];
    18.     if(ereg($EmailMask,$DataStr))
    19.     {
    20.         echo "$DataStr <br/>";
    21.         echo 'Прошло';
    22.     }
    23.     else
    24.     {
    25.         echo "$DataStr <br/>";
    26.         echo 'Ошибка';
    27.     }
    28. }
    29. ?>
    30. <form name="testform" action="posix.php" method="post">
    31. <input type="text" name="EmailField" size=30 value=<?php echo '"'.$DataStr.'"';?> />
    32. <input type="button" name="BtnSubmit" value="Проверить" onclick="BtnClick();"/>
    33. </form>
    34. </body>
    35. </html>
    Вообщем возникло 2 проблемы:
    1) Не корректно контролирует размер домена, проходят длинны 3,4,5, и.т.д.
    2) Допускает адреса вида _1@1.rrr но 1_@1.rrr уже отсекает.

    В чем тут может быть дело?
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    posix регэкспы в php считаются устаревшими, юзайте pcre. а проблема скорее всего в том, что отсутствуют ограничители строки, в pcre это пара ^, $ для начала и конца строки, как оно в posix не знаю.
     
  3. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Кхм, если я не ошибаюсь, то в POSIX вообще не существует такого понятия, как ограничители (на равне с жадностью).
    Отсюда и появились функции, наподобии eregi, eregi_replace, поскольку в PCRE ограничители существуют только из-за возможности указания флагов, а в POSIX их просто нет.
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Ну а всё таки они там есть.

    Код (Text):
    1. sergey89@thelogin ~> php -r 'var_dump(ereg("^([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})\$", "_1@1.rrr"));'
    2. int(0)
     
  5. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Странно все это. Ладно бы еще я сам что-то придумал... Но этот пример я беру из книжки "PHP5 полное руководство" автор Джон Коггзолл. Глава 3. Регулярные выражения. Подраздел POSIX. Вставляю пример из книги в свой код и получаю то, что написано в первом посте.
    Видимо с момента издания его книги (2005) что то поменялось в PHP в обработке регулярных выражений?
     
  6. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Насчет первого вопроса извиняюсь, сам тупанул. Все правильно работает.

    Хотя со вторым вопросом все аналогично. Он корректно находит выделяет из неправильного емайла правильный, и сообщает что типа нашел.

    Т.е. например обрабатывая строку
    __Abc@abc.12345 функция находит в ней правильный адрес Abc@abc.123 и возвращает истину, а лишнии символы отрубает. Вообщем надо как-то жестко фиксировать первый и последний символ, что бы шаблон работал более корректно.
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Я же показал, как
    Код (Text):
    1. ^([[:alnum:]]+)@([[:alnum:]]+)\.([[:alnum:]]{3})$
     
  8. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Угу, спасибо за подсказку, я просто сразу не просек фишку, зачем делать акценты на первый и последний символы, если на них вроде как не вводились дополнительные ограничения. Но теперь разобрался. Всем большое спасибо.