Регулярни изрази (Част 2)

 
ho ho
Източник: http://s3.amazonaws.com/theoatmeal-img/comics/email_monster/1.png

 Съпоставяне с шаблони


POSIX Regex функции


В РНР има две вградени функции, предназначени специално за съпоставяне с шаблони: егеg() (тази функция не се препоръчва от PHP 5.3.0 и нагоре) и eregi() (тази функция не се препоръчва от PHP 5.3.0 и нагоре). Разликата между тях е, че егеg() реагира на регистрите, а eregi()- не. По-широкоизползвана е функцията егеg(), ако не е необходимо толкова точно съвпадение, като например за целите на безопасност с паролите. Стойността на двете функции ще е TRUE, ако има съвпадение със шаблона и FALSE в противен случай.
Ето и два начина за прилагане на тези функции:

ereg("pattern", "string");

или

$Pattern = "pattern";
$String = "string";
eregi($Pattern, $String);

Ще създадем нов файл HandleForm_1.php, който ще работи с form_1.html. HandleForm_1.php ще проверява дали правилно е въведен адресът на електронната поща.
Съдържанието на файла form_1.html:
<!--form_1.html-->
<!Doctype html>
<html>
<head>
<title>HTML Форма</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>

<form  action="HandleForm_1.php" method="post" target="_blank">
Име: <br/><input type=text name="firstname" /> <br/><br/>
Фамилия: <br/><input type=TEXT NAME="lastname" /> <br/><br/>
Имейл адрес: <br/><INPUT TYPE=TEXT NAME="email"/><br/><br/>
Коментар: <br> <textarea NAME ="comments" ></textarea><br/><br/>
<input type=submit name="submit"  
formenctype="multipart/form-data" value="Напред >>"/>
</form>

</body>
</html>

Проверка за съответствие с шаблона с функцията eregi()


Синтаксисът та функцията eregi() е следния:

int eregi(string $pattern, string $string[,array &$regs])

Променливата $pattern съдържа регулярния израз.
Променливата $string е входният стринг.
Ако се намерят съвпадения в променливите $pattern и $string, функцията се извиква с третия аргумент $regs. Съвпаденията ще бъдат съхранени в елементите на масива $regs. Върнатата стойност от функцията eregi() е стринг, съдържащ откритите съвпадения. Функцията eregi() ще върне FALSE, ако няма открити съвпадения. Ако незадължителният параметър $regs не е поставен и не са открити съвпадения, функцията eregi() връща 1.

PCRE (Perl-Compatible Regular Expressions) функции


В практиката, за откриване на съвпадения в текст, по-често се ползва функцията preg_match().
Синтаксисът й е:

int preg_match(string $pattern, string $subject [,array &$matches[, int $flags = 0 [, int $offset = 0 ]]])

Променливата $pattern е шаблона.
Променливата $subject е входния стринг.
Масивът $matches се запълва с резултатите от търсенето.
Допълнителна информация може да откриете на адрес:
http://php.net/manual

Не прилагайте функцията preg_match(), ако само искате да проверите дали един стринг се съдържа в друг стринг.
  1. Отворете текстовия редактор и създайте нов файл. Дайте му наименование HandleForm_1.php.
  2. Въведете:
    <!--HandleForm_1.php-->
    <!DOCTYPE html>
    <html>
    <head>
    <title>Прирожение на регулярните изрази</title>
    <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
    </head>
    <body>
    <?php
    
    /*Тази страница получава и обработва данните от „form_1.html” */
    
    if (isset($_POST['submit'])) {
        $firstname = $_POST['firstname'];
        $lastname = $_POST['lastname'];
        $email = $_POST['email'];
        $comments = $_POST['comments'];
    
    //Проверява дали са въведени име и фамилия на потребителя    
        if (($firstname) and ($lastname)) {
    $name = $firstname . " ". $lastname;
    echo "Здравейте," . " " . $name . "!" . "<br>" . "<br>";
    } 
    else { 
    echo "Моля, въведете име и фамилия!<br>";
    }
    
    //Задава шаблон за адрес на електронната поща с PCRE 
    $pattern = ".+@.+\..+";
      
    //Проверява за съвпадения с функцията eregi()
    if (eregi($pattern, $email, $matches) ) {
    echo "Въведената информация е получена!" . "<br>";
    echo "Вашият имейл адрес е:" . " " . $email. "<br>";
    echo "Вашият коментар е:" . " " . $comments . "<br>". "<br>";
    } else {
    echo "Моля, въведете валиден имейл адрес!" . "<br>" . "<br>". "<br>" ;
    }
    
    //Задава шаблон за адрес на електронната поща с POSIX Regex 
    $pattern = "^[a-zA-Z0-9_.+-]+@?[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]^";
      
    //Проверява за съвпадения с функцията preg_match()
    if (preg_match($pattern, $email, $matches) ) {
    echo "Въведената информация е получена!" . "<br>";
    echo "Вашият имейл адрес е:" . " " . $email. "<br>";
    echo "Вашият коментар е:" . " " . $comments;
    } else {
    echo "Моля, въведете валиден имейл адрес!" . "<br>" ;
    }
    }
       
    ?>
    </body>
    </html>
    
  3. Съхранете файла. Качете го на сървъра.
  4. Отворете файла form_1.html.
  5. Попълнете формата.
  6. Кликнете върху бутона "Напред >>".
Въведените данни ще се предадат за обработка на файла HandleForm_1.php.
Как работи скриптът?
Частта от кода
//Проверява дали са въведени име и фамилия на потребителя    
    if (($firstname) and ($lastname)) {
$name = $firstname . " ". $lastname;
echo "Здравейте," . " " . $name . "!" . "<br>" . "<br>";
} 
else { 
echo "Моля, въведете име и фамилия!<br>";
}
проверява дали са въведени име и фамилия на потребителя и извежда съответните съобщения в прозореца на браузъра. Тук, ако желаете, можете да използвате регулярен израз, за да проверите дали името и фамилията са въведени правилно.
Името и фамилията се обединяват в една променлива $name. Ако името (или фамилията) на потребителя не e въведено, се изписва покана към потребителя да го въведе.
Следващата крачка е създаване на шаблон за проверка на адреса на електронната поща.
Да разгледаме шаблона, който ще използва функцията eregi():

$pattern = ".+@.+\.+.";

Адресът на електронната поща може да се представи във вида

[първа част]@[втора част].[трета част]

или

[първа част] + @ + [втора част] + . + [трета част]

Първата точка означава, че първата част на адреса на електронната поща може да съдържа какъв да е символ. С помощта на символа + добавяме символа @, който задължително се съдържа във всички електронни адреси. Следват произволни символи от втората част, добавяме точката (екранирали сме я), съдържаща се в името на домейна и отново се добавят произволни символи за третата част. Шаблонът е съвсем прост, по-нататък ще напишем по-сложен. За сега това е достатъчно. Прилагаме шаблона за да проверим адреса на електронната поща.
//Проверява за съвпадения с функцията eregi()
if (eregi($pattern, $email, $matches) ) {
echo "Въведената информация е получена!" . "<br>";
echo "Вашият имейл адрес е:" . " " . $email. "<br>";
echo "Вашият коментар е:" . " " . $comments . "<br>". "<br>";
} else {
echo "Моля, въведете валиден имейл адрес!" . "<br>" . "<br>". "<br>" ;
}
Ако стойността на променливата $email съответства на шаблона $pattern, условието е истина и на екрана се появяват съответните съобщения, в противен случай потребителят се подканва да въведе валиден имейл адрес.
По идентичен начин се извършва проверката с функцията preg_match(), но синтаксисът на шаблона е малко по-различен.
След изпълнение на form_1.html и HandleForm_1.php, в прозореца на браузъра ще видим:

regex_4.png

sign.png

Няма коментари:

Публикуване на коментар