Подтвердите URL-адрес со строкой запроса, содержащей адрес электронной почты, используя PHP

Привет, у меня проблема с правильной проверкой URL-адреса со строкой запроса, содержащей адрес электронной почты, например:

https://example.com/[email protected]

это письмо является правильным, [email protected] является псевдонимом [email protected]

У меня есть такое регулярное выражение:

$page = trim(preg_replace('/[\\0\\s+]/', '', $page));

но он работает не так, как я ожидал, потому что он заменяет + пустой строкой, что не так. Он должен сохранить этот + как псевдоним адреса электронной почты и должен вырезать специальные символы, сохраняя при этом правильность адреса.

Пример неправильного URL-адреса с +:

https://examp+le.com/?email=example@exam+ple.com

Другие URL-адреса без электронной почты в строке запроса должны правильно проверяться с использованием этого регулярного выражения

Есть идеи, как это решить?

Советую использовать для тестирования regexr.com, может быть очень полезно

Leonardo Gasparini 14.09.2018 13:29

Почему вам нужно передавать электронную почту в качестве параметра GET? Разве вы не можете построить свою логику по-другому?

Leonardo Gasparini 14.09.2018 13:35

Вы должны urlencode () любое значение, которое вы отправляете в качестве параметра запроса в URL-адресе. В противном случае браузер будет интерпретировать специальные символы (например, +, заменяющий пробел). Браузер не может знать, что вам нужен буквальный знак плюса. Кроме того, почему вы проверяете строку запроса как часть URL-адреса? Не могли бы вы объяснить, для чего на самом деле нужна эта «проверка»?

Magnus Eriksson 14.09.2018 13:36

Попробуйте preg_replace('~[\0\s]+|\++(?=.*\?)|(\?.*)~', '$1', $s)

Wiktor Stribiżew 14.09.2018 13:43

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

Bartek Walaszczyk 14.09.2018 13:46

@ WiktorStribiż но это все еще не работает

Bartek Walaszczyk 14.09.2018 13:49

Извините, забыл удалить опережающий просмотр, он должен быть preg_replace('~[\0\s]+|\++|(\?.*)~', '$1', $s)

Wiktor Stribiżew 14.09.2018 13:53

по-прежнему не работает для меня, потому что он должен возвращать весь адрес, например https://example.com/[email protected] или этот https://example.com/[email protected]&email2=joh‌​[email protected], даже когда я использую неправильный, например: https://exam+ple.com/[email protected]&email2=jo‌​hn+test2@exam+ple.co‌​m

Bartek Walaszczyk 14.09.2018 14:01

Я не думаю, что это возможно, так как вы хотите удалить + внутри правильных английских слов, верно?

Wiktor Stribiżew 14.09.2018 14:02

он должен удалить из этого примера: https://exam+ple.com/[email protected]&email2=jo‌​hn+test2@exam+ple.co‌​m только + из слов exam+ple.comtest1+@example@exam+ple.com, но не из john+test1@

Bartek Walaszczyk 14.09.2018 14:05

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

Wiktor Stribiżew 14.09.2018 14:10

единственное правильное правило - установить + в качестве псевдонима на правильный адрес электронной почты, например [email protected], где +test - это псевдоним для [email protected].

Bartek Walaszczyk 14.09.2018 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
12
516
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, это то, что вы ищете:

<?php

function replace_plus_sign($string){
    return
    preg_replace(
        '/#/',
        '+',
        preg_replace(
            '/\++/i',
            '',
            preg_replace_callback(
                '/(email([\d]+)?=)([^@]+)/i',
                function($matches){
                    return $matches[1] . preg_replace('/\+(?!$)/i', '#', $matches[3]);
                },
                $string
            )
        )
    );
}

$page = 'https://exam+ple.com/[email protected]&email2=john+test2@exam+ple.com';
echo replace_plus_sign($page);

Дает следующий результат:

https://example.com/[email protected]&[email protected]

Сначала я заменил действующий знак + на адресах электронной почты на #, затем удалил все оставшиеся +, после чего заменил # на +.

Это решение не будет работать, если в URL-адресе есть #, и поэтому вам нужно будет использовать другой символ вместо # для временной замены.

если вы удалите @ отсюда: верните $ match [1]. preg_replace ('/ \ + (?! $) / i', '#', $ соответствует [3]). '@'; это будет идеально

Bartek Walaszczyk 14.09.2018 22:59

Другие вопросы по теме