Как сделать так, чтобы функция PHP preg_match соответствовала домену в формате адреса электронной почты?

Ниже приведена часть скрипта, которая нуждается в модификации. В настоящее время оно будет соответствовать любому слову непосредственно после @ в адресе электронной почты, предоставленном пользователем. Мне нужно, чтобы оно могло совпадать с любым словом сразу после @ или с другим словом и точкой (.), Например: user@domain.com.au должен соответствовать домену, user@someword.domain.com также должен соответствовать домену независимо от .someword перед (который меняет пользователя на пользователя и существует для некоторых, но не для других.

PHP-код:

preg_match('|@([0-9a-zA-Z]+)\.|i', $username, $match);

А ниже приведен весь код с конфиденциальной информацией, измененной в целях безопасности.

<?php

// PHP code in child theme of WordPress multisite network functions.php

add_filter( 'authenticate', 'external_auth', 10, 3 );
add_filter( 'login_redirect', 'ds_login_redirect', 10, 3 );

function external_auth( $user, $username, $password ){

// Make sure a username and password are present for us to work with
if($username == '' || $password == '') return;

// Try to log into the external service or database with username and password

$args = array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'body' => array( 'username' => $username, 'password' => $password ),
'cookies' => array()
);

$ext_auth = wp_remote_post("http://auth-server:port-number/api-token-auth/",$args);

// if external authentication was successful
if($ext_auth['response']['code'] == 200) {

$userobj = new WP_User();
$user = $userobj->get_data_by( 'login', $username );
// Does not return a WP_User object :(
$user = new WP_User($user->ID);
// Attempt to load up the user with that ID

if( $user->ID == 0 ) {
// The user does not currently exist in the WordPress user table.
// If you do not want to add new users to WordPress if they do not
// already exist uncomment the following line and remove the user creation code
//$user = new WP_Error( 'denied', __("ERROR: Not a valid user for this system") );

// Setup the minimum required user information
$new_user_id =  wpmu_create_user($username, $password, $username);
// A new user has been created


preg_match('|@([0-9a-zA-Z]+)\.|i', $username, $match);

$path = '/'.$match[1].'/';

$domain = 'the-wordpress-network-site.com';

// Figure out their blog to add permission to
$blog_id = get_blog_id_from_url ( $domain, $path );

// Specify their role
$role = 'subscriber';

// Give the user access to their blog.
add_user_to_blog($blog_id, $new_user_id, $role);

// Load the new user info
$user = new WP_User ($new_user_id);
}

}else if($ext_auth['response']['code'] == 400){
$user = new WP_Error( 'denied', __("ERROR: User/pass bad") );
}

// Comment this line if you wish to fall back on WordPress authentication
remove_action('authenticate', 'wp_authenticate_username_password', 20);

return $user;
}

function ds_login_redirect( $redirect_to, $request_redirect_to, $user )
{
if ($user->ID != 0) {
$user_info = get_userdata($user->ID);
if ($user_info->primary_blog) {
$primary_url = get_blogaddress_by_id($user_info->primary_blog) . 'index/';
if ($primary_url) {
//echo $primary_url; die();
wp_redirect($primary_url);
die();
}
}
}

return $redirect_to;
}

?>

3

Решение

Это позволит извлечь домен из электронной почты:

  1. ([a-zA-Z0-9-\_]*)\.[a-zA-Z0-9\-\_]{2,4}$
  2. @ -Char включены: @.+?([a-zA-Z0-9-\_]*)\.[a-zA-Z0-9\-\_]{2,4}$

([a-zA-Z0-9-\_]*) этот группирует часть перед последним, домен, очевидно. Это ваш матч.

\.[a-zA-Z0-9\-\_]{2,4}$ это соответствует последней части строки от 2 до 4 символов в конце строки (.com, .de, .it …).

Таким образом, вы всегда получите 2-ую последнюю часть в строке между точками.

Нажмите меня (Regex101)


Редактировать в соответствии с комментариями:
Поскольку вы хотите игнорировать тот факт, что домены написаны во 2-й последней части, вам нужно будет разбить строку на каждую часть между точками и попытаться пропинговать домен, если он реален.

Изменить 2:
Проверьте эту статью Wikipedia Email-формат. Существует список допустимых форматов для электронных писем. Каждый пример в этой статье описывается регулярным выражением, которое я написал. Если вы ожидаете, что люди будут печатать недействительные письма, такие как «paul@yahoo.mymom.com» (просто сказать -> недействительные), вы также можете ожидать, что люди пишут «IhaveNoEmail», что также не приведет к правильному подкаталогу.

Так что я все еще на своем месте: выберите регулярное выражение или дайте мне реальный аргумент, почему домен должен быть написан где-то еще :).

1

Другие решения

Обратите внимание, что ограничение {2-4} в регулярном выражении C4ud3x будет запрещать адреса от новых / более длинных оДВУ который, хотя в настоящее время необычен, все же должен считаться действительным. Вы также хотите рассмотреть пользователей из стран, где домены второго уровня распространены, и не пропустите «реальный» домен, потому что ваше регулярное выражение захватывает только, скажем, .org.uk.

Учитывая вышесказанное и заимствуя у W3C рекомендуемое регулярное выражение, пытаться:

[a-zA-Z0-9-_]*(\.[a-zA-Z0-9-_]{0,3})?\.([a-zA-Z0-9-_]{0,61})$ — смотрите на RegExr

Конечно, вы должны все еще утверждать адрес в вашем PHP-скрипте, прежде чем пытаться извлечь домен, чтобы вы всегда получали хороший результат.

0

Мой коллега нашел ответ, он настоящий гений PHP!

Вместо этого кода в вопросе:

preg_match('|@([0-9a-zA-Z]+)\.|i', $username, $match);

$path = '/'.$match[1].'/';

$domain = 'the-wordpress-network-site.com';

Теперь код гласит:

$domain_end = explode('@', $username);
$match = explode('.', $domain_end[1]);
$domain = 'the-wordpress-network-site.com';
foreach ($match as $blog_key){
$path = '/'.$blog_key.'/';
$blog_id = get_blog_id_from_url ( $domain, $path );
if ($blog_id != 0) break;
}

Это решило загадку к моему удивлению и благодарности. В любом случае, спасибо за все предложения и советы, я все еще буду здесь, чтобы задать еще много вопросов в будущем, я не сомневаюсь 🙂

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector