Прошу помощь с регулярными выражениями

big boy
На сайте с 18.11.2006
Offline
308
679

Есть форма обратной связи. На данный момент регулярка проверяет на предмет правильности заполнения полей имя, email и телефон. Однако, надо оставить право за пользователем, хочет ли он оставлять свои контакты или нет, поэтому поля могут быть и пустыми.

Но на данный момент, если оставить их пустыми, скрипт ругается.

Форма:

<form name="contactform" method="post" action="send.php">
<label for="first_name">Имя</label>
<input id="forminput" type="text" name="first_name" maxlength="50" size="30">

<label for="email">Ваш email</label>
<input id="forminput" type="text" name="email" maxlength="80" size="30">

<label for="telephone">Ваш телефон</label>
<input id="forminput" type="text" name="telephone" maxlength="30" size="30">

<label for="comments">Сообщение</label>
<textarea id="forminput" name="comments" maxlength="1000" cols="25" rows="6"></textarea>

<input type="submit" value="Отправить">
</form>

Файл send.php:

<?php
if(isset($_POST['email'])) {


$email_to = "email@mail.ru";
$email_subject = "Обращение с сайта:".$_POST['first_name']." ".$_POST['last_name'];


function died($error) {
// your error code can go here
echo "<p class=\"error\"><B>Ошибка!</B><BR>Очень жаль, но нам кажется, что вы допустили ошибки при заполнении формы. ";
echo "Эти ошибки перечислены ниже.</p><br /><br /><ul>";
echo $error."<br /><br />";
echo "</ul><p>Пожалуйста, <a href=\"#\" onClick=\"history.go(-1);return true;\">вернитесь назад</a> и исправьте указанные ошибки, чтобы отправить ваше сообщение.</p><br /><br />";
die();
}

// validation expected data exists
if(!isset($_POST['comments'])) {
died('Ваше сообщение пусто.');
}

$first_name = $_POST['first_name'];
$email_from = $_POST['email'];
$telephone = $_POST['telephone'];
$comments = $_POST['comments'];

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= '<li>Поле Email заполнено неправильно.</li>';
}
$string_exp = "/^[A-Za-zа-яА-Я.'-]+$/ui";
if(!preg_match($string_exp,$first_name)) {
$error_message .= '<li>Поле <B>имя</B> заполнено некорректно.</li>';
}
if(strlen($comments) < 2) {
$error_message .= '<li>Ваше сообщение слишком короткое.</li>';
}
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Обращение через форму обратной связи на сайте.\n\n";

function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}

$email_message .= "Имя: ".clean_string($first_name)."\n";
$email_message .= "Фамилия: ".clean_string($last_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Телефон: ".clean_string($telephone)."\n";
$email_message .= "Сообщение: ".clean_string($comments)."\n";


// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
?>

<!-- include your own success html here -->

<p class="success"><B>Ваше сообщение отправлено!</p>

<?php
}
?>

Можно ли включить в регулярку возможность оставлять поля пустыми, но проверять когда они вводятся?

✔ Google spam update убил сайты? Что делать - https://webmasta.ru/blog/google-october-2022-spam-brain-update
АД
На сайте с 26.03.2013
Offline
3
#1

Можно, но экономичнее будет так:

if(trim($first_name) && !preg_match($string_exp,$first_name)) {

$error_message .= '<li>Поле <B>имя</B> заполнено некорректно.</li>';

}

Для этих целей лучше использовать фильтр.

Лёгкая и быстрая CMS с поддержкой PHP PDO (http://softex.biz/ru).
LEOnidUKG
На сайте с 25.11.2006
Offline
1743
#2

Без регулярки проверяйте на пустоту.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
doctorpc
На сайте с 12.07.2009
Offline
112
#3
big boy:
Можно ли включить в регулярку возможность оставлять поля пустыми, но проверять когда они вводятся?

Прежде чем применять регулярку, проверяйте, не пустое ли поле.

Если пустое, то никакие проверки не применяйте, в том числе и на длину и регулярное выражение.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий