Привет, у меня проблема с правильной проверкой 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-адреса без электронной почты в строке запроса должны правильно проверяться с использованием этого регулярного выражения
Есть идеи, как это решить?
Почему вам нужно передавать электронную почту в качестве параметра GET? Разве вы не можете построить свою логику по-другому?
Вы должны urlencode () любое значение, которое вы отправляете в качестве параметра запроса в URL-адресе. В противном случае браузер будет интерпретировать специальные символы (например, +, заменяющий пробел). Браузер не может знать, что вам нужен буквальный знак плюса. Кроме того, почему вы проверяете строку запроса как часть URL-адреса? Не могли бы вы объяснить, для чего на самом деле нужна эта «проверка»?
Попробуйте preg_replace('~[\0\s]+|\++(?=.*\?)|(\?.*)~', '$1', $s)
это старый фрагмент кода, где функция x устанавливает header () с этим URL-адресом для перенаправления пользователя на настроенный URL-адрес с его адресом электронной почты в строке запроса, и пользователь может установить свой адрес электронной почты с помощью +, и это создает проблему
@ WiktorStribiż но это все еще не работает
Извините, забыл удалить опережающий просмотр, он должен быть preg_replace('~[\0\s]+|\++|(\?.*)~', '$1', $s)
по-прежнему не работает для меня, потому что он должен возвращать весь адрес, например https://example.com/[email protected] или этот https://example.com/[email protected]&email2=joh[email protected], даже когда я использую неправильный, например: https://exam+ple.com/[email protected]&email2=john+test2@exam+ple.com
Я не думаю, что это возможно, так как вы хотите удалить + внутри правильных английских слов, верно?
он должен удалить из этого примера: https://exam+ple.com/[email protected]&email2=john+test2@exam+ple.com только + из слов exam+ple.comtest1+@example@exam+ple.com, но не из john+test1@
Какие здесь правила? Как вы думаете, почему поможет регулярное выражение?
единственное правильное правило - установить + в качестве псевдонима на правильный адрес электронной почты, например [email protected], где +test - это псевдоним для [email protected].






Думаю, это то, что вы ищете:
<?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]). '@'; это будет идеально
Советую использовать для тестирования regexr.com, может быть очень полезно