Ответ 1
if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString))
{
echo 'Secure enough';
}
Ответ обновлен на основе fooobar.com/questions/225352/..., thnx https://stackoverflow.com/users/116286/jb
Я хочу определить, содержит ли строка как числа, так и буквы.
Например:
PncC1KECj4pPVW
, он будет записан в текстовый файл, потому что он содержит оба.qdEQ
, он не будет, потому что он содержит только буквы.Есть ли способ сделать это?
Я пытался использовать
$string = PREG_REPLACE("/[^0-9a-zA-Z]/i", '', $buffer);
Но это не сработало.
Любая помощь будет оценена.
if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString))
{
echo 'Secure enough';
}
Ответ обновлен на основе fooobar.com/questions/225352/..., thnx https://stackoverflow.com/users/116286/jb
Кажется, что самый простой способ - просто сделать это в двух регулярных выражениях.
if (preg_match('/[A-Za-z]/', $myString) && preg_match('/[0-9]/', $myString))
{
echo 'Contains at least one letter and one number';
}
Я предполагаю, что другой способ сделать это - это ниже. В нем говорится "письмо, а затем в какой-то момент число (или наоборот)". Но выше, легче читать IMO.
if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString))
{
echo 'Contains at least one letter and one number';
}
Мой вопрос только в том, должно ли быть одно регулярное выражение. Я бы пошел с двумя или тремя (потому что вам нужно создать небольшое сложное регулярное выражение, чтобы сделать это сразу.
Скажем, что вам нужно иметь:
[A-Z]
[A-Z]
\d
Самое простое и эффективное решение:
if( preg_match( '~[A-Z]~', $password) &&
preg_match( '~[a-z]~', $password) &&
preg_match( '~\d~', $password) &&
(strlen( $password) > 6)){
echo "Good password";
} else {
echo "Not so much";
}
В противном случае в одном регулярном выражении вам придется рассмотреть несколько вариантов:
[a-z][A-Z]+\d
[a-z]\d+[A-Z]
[a-z][A-Z]+\d
[a-z]\d+[A-Z]
\d[a-z]+[A-Z]
\d[a-z]+[A-Z]
Присоедините его к одному большому и едва читаемому регулярному выражению "ored", например:
~([a-z][A-Z]+\d|[a-z]\d+[A-Z]|[A-Z][a-z]+\d|[A-Z]\d+[a-z]|\d[a-z]+[A-Z]|\d[A-Z]+[a-z])~
Конечно, вы можете пойти (когда нужно просто проверить верхний и нижний регистр):
preg_match( '~([a-z][A-Z]|[a-z][A-Z])~');
И еще нужно проверить длину вручную. Второе решение кажется довольно неэффективным и трудночитаемым для меня. Моя рекомендация: идти первым.
Это работает чисто:
$myString="abc123";
if( preg_match('([a-zA-Z].*[0-9]|[0-9].*[a-zA-Z])', $myString) )
{
echo('Has numbers and letters.');
} else {
echo("no");
}
Чтобы увидеть его в действии, скопируйте его и вставьте здесь: http://phptester.net/index.php?lang=en
PHP имеет встроенную функцию для этого. Он назывался ctype_alnum
.
if(!ctype_alnum($string)) {
return $error;
}
// Continue on your way...
Если вы хотите сопоставлять только буквенно-цифровые символы (т.е. считайте строку недействительной, как только в ней есть что-то еще, например пробелы или специальные символы), это должно работать.
В противном случае просто удалите первый preg_match()
.
function myTest($string)
{
echo "test '".$string."': "
. intval(preg_match('/^[a-z\d]+$/i', $string) // has only chars & digits
&& preg_match('/[a-z]/i', $string) // has at least one char
&& preg_match('/\d/', $string)) // has at least one digit
. "\n";
}
myTest('aAa'); // => 0
myTest('111'); // => 0
myTest('aAa111bbb'); // => 1
myTest('111aAabbb'); // => 1
myTest('aAabbb111'); // => 1
myTest('111bBb222'); // => 1
myTest('111 bBb 222'); // => 0
myTest('$$$$'); // => 0
для проверки, содержит ли строка числа или нет!
function ContainsNumbers($String){
return preg_match('/\\d/', $String) > 0;
}
Если вам нужно поддерживать несколько языков, из PHP 5.1 добавлены дополнительные escape-последовательности для типов символов перечисленных здесь.
Следующие функции воспользуются этим и позволяют проверять буквы и цифры в нескольких алфавитах:
проверить, существует ли какая-либо буква в строке:
function has_letter($x){
if (preg_match("/[\p{L}]/u",$x)) {
return true;
}
return false;
}
строка проверки содержит любое число
function has_number($x) {
if (preg_match("/[\p{N}]/u",$x)) {
return true;
}
return false;
}
Использование
$string = '123اختبا';
has_letter($string); // true
$string = '೪౨౨';
has_number($string); // true
Оба вместе в соответствии с запросом
$string='I am 28';
if (has_letter($string)&&has_number($string)){
// true
}
$string='I am ౨೩೫';
if (has_letter($string)&&has_number($string)){
// true
}
$string='Привет, друг, как ты?';
has_number($string); // false - this Russian text doesn't contain a number
Вот несколько рекомендаций ниже:
Проблема: нет подтверждения в строке внутри строки Напр.
OM 4 OM, OM4OM , space OM 4 OM space, space OM4OM space. -----> No valdation over this??
Решение:
if (preg_match("/[A-Za-z].*[0-9]/",$_POST["name"]))
{
header("location:http://localhost/Test1.html");
exit;
}
Logic: /[A-Za-z].*[0-9]/
Он говорит о первых символах, а затем о некоторых точках.