Проверка формы на наличие URL-адресов перед отправкой (на стороне сервера)

#javascript #html #smarty

#javascript #HTML #умный

Вопрос:

У меня есть следующий код, который проверяет форму перед отправкой на стороне сервера, что я хотел бы включить (если возможно), так это проверить сообщение на наличие URL-адресов и, если таковые имеются, предотвратить отправку сообщения.

 if (!empty($_POST['name']) amp;amp; !empty($_POST['fromemail']) amp;amp; !empty($_POST['message']) amp;amp; $go == TRUE)
{
    //data has been filled
    $name = Filter::no_html($_POST['name']);
    $from = Filter::no_html($_POST['fromemail']);
    $start_dt = Filter::no_html($_POST['start_dt']);
    $end_dt = Filter::no_html($_POST['end_dt']);
    $comments = Filter::no_html($_POST['message']);
    $validate->isEmpty($name, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_NAME);
    $validate->isEmpty($from, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_EMAIL);
    $validate->isSingleEmail($from, LANG_JAVASCRIPT_PLEASE_ENTER_EMAIL);
    $validate->isEmpty($start_dt, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_START_DATE);
    $validate->isEmpty($end_dt, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_END_DATE);
    $validate->isEmpty($comments, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_MESSAGE);
    $modules->call_hook('contact_owner_submit', ''); // Call any module functions
    $id = (int) @$_POST['ownerid'];
    $vehicle = (int) @$_POST['listingid'];

    if ($validate->isError())
    {
  

Ответ №1:

Вы могли бы выполнить поиск сообщения с помощью метода stristr по определенным критериям в строке:

 $has_url = (stristr($comments, 'http') || stristr($comments, 'www.'));
if($has_url) {
  // prevent submit
}
  

Более подробная информация о методе stristr здесь:
https://www.php.net/manual/en/function.strstr.php

Итак, ваш код может выглядеть следующим образом:

 if (!empty($_POST['name']) amp;amp; !empty($_POST['fromemail']) amp;amp; !empty($_POST['message']) amp;amp; $go == TRUE) {

  $has_url = (stristr($_POST['message'], 'http') || stristr($_POST['message'], 'www.'));
  if($has_url) {
    // whatever happens if contains url
  }

  $name = Filter::no_html($_POST['name']);
  $from = Filter::no_html($_POST['fromemail']);
  $start_dt = Filter::no_html($_POST['start_dt']);
  $end_dt = Filter::no_html($_POST['end_dt']);
  $comments = Filter::no_html($_POST['message']);
  $validate->isEmpty($name, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_NAME);
  $validate->isEmpty($from, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_EMAIL);
  $validate->isSingleEmail($from, LANG_JAVASCRIPT_PLEASE_ENTER_EMAIL);
  $validate->isEmpty($start_dt, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_START_DATE);
  $validate->isEmpty($end_dt, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_END_DATE);
  $validate->isEmpty($comments, LANG_JAVASCRIPT_PLEASE_ENTER . " " . LANG_YOUR_MESSAGE);
  $modules->call_hook('contact_owner_submit', ''); // Call any module functions
  $id = (int) @$_POST['ownerid'];
  $vehicle = (int) @$_POST['listingid'];

  if ($validate->isError())
    // whatever goes here
  {
}
  

Комментарии:

1. Привет, Марк, большое спасибо за ваш ответ, просто интересно, как / куда я бы включил то, что вы предоставили, в мой код? Спасибо, Джейсон.

2. Привет, Джейсон. Нет проблем, хорошее место было бы вверху вашего оператора if, чтобы предотвратить дальнейшее выполнение функции, если значение $has_url равно true, и вместо этого использовать $_POST['message'] в stristr() функции перед определением $comments переменной.

3. Привет, Марк, извини за беспокойство, но, как ты думаешь, ты мог бы опубликовать код так, как, по твоему мнению, он должен выглядеть, поскольку я не уверен, как это сделать самому. Еще раз благодарю вас за вашу ценную помощь. Джейсон

4. Привет, Марк, ты звезда, это сработало как по волшебству, просто мысль, а также включение URL-адресов можно ли использовать, чтобы не отправлять сообщение, если оно содержит определенные слова, если да, то как бы мне это к нему добавить? Действительно ценю помощь, которую вы мне оказали.