PHP блокирует URL и домены, но разрешает адреса электронной почты - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть метод, который я использую для очистки выходных данных от пользовательских данных. Я могу передать параметры, чтобы разрешить или запретить URL-адреса и электронные письма независимо. Раньше он работал нормально до тех пор, пока я не использовал его с запрещенными URL-адресами и разрешенными электронными письмами. Проблема в том, что регулярное выражение, которое я использую для блокировки URL-адресов, также блокирует домен по адресам электронной почты. Как я могу заблокировать URL и домены, но только если они не являются частью адреса электронной почты?

Мой существующий код;

// email address removal
if ( ! ISSET($options['email']) || $options['email'] === FALSE) {
    $pattern = "/[^@\s]*@[^@\s]*\.[^@\s]*/";
    $replacement = '<span class="muted">*</span>';
    $string = preg_replace($pattern, $replacement, $string);
}
// url - link removal
if ( ! ISSET($options['url']) || $options['url'] === FALSE) {
    $pattern = "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i";
    $replacement = '<span class="muted">**</span>';
    $string = preg_replace($pattern, $replacement, $string);
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Если вы работаете с PHP, хорошим способом проверки, является ли строка адресом электронной почты, является filter_var() (см. PHP filter_var. Эта функция вернет отфильтрованное значение или FALSE если фильтр не работает (нет действительного адреса электронной почты).

$filtered = filter_var($email_string, FILTER_VALIDATE_EMAIL);
if(!empty($filtered )) {
  // valid email address
} else {
  // not a valid email address
}

Доступно еще несколько фильтров: https://www.php.net/manual/en/filter.filters.php

Если вы хотите использовать regex для проверки вашего адреса электронной почты, вы можете взглянуть на этот пример: https://regex101.com/r/aG8fB6/2 Они используют это регулярное выражение для проверки адресов электронной почты:

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z]+

В PHP вы можете использовать preg_match для проверки строки на соответствие регулярному выражению ( PHP preg_match).

0 голосов
/ 15 апреля 2019

Что вы можете сделать, это проверить, используя отрицательные lookaround утверждения, что то, что находится слева (?<!\S), а что справа (?!\S), не является символом без пробелов.

Немного обновленная версия вашего паттерна может быть:

(?<!\S)[a-zA-Z]*[:/]*[\w-]+\.+[\w:./%&=?-]+(?!\S)

Regex demo

Обратите внимание, что вам не нужно избегать косой черты, если выиспользуйте другой разделитель , чем /, как ~, дефис - может быть перемещен в начало или конец класса символов, чтобы не экранировать его, и точка . не должнабыть экранированным в классе персонажей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...