Я новичок в PHP и у меня не так много опыта работы с is, как с другими языками. У меня есть следующая форма, и я хотел бы проверить, начинается ли поле имени с прописной буквы, если поле псевдонима находится в нижнем регистре, и если поле фамилии все в верхнем регистре. Я видел, как люди превращают строки и текст в разные случаи, но я не знаю, как выполнить проверку, на которую я надеюсь.
Я преобразовал текст в нижний/верхний/регистр, но это всего лишь половина строки очень простого кода от W3CSchools.
Также это не дубликат любого другого вопроса. Другие сосредоточены на чистых функциях PHP, таких как создание строки и отображение результата, другой вопрос даже не относится к тому, чего я пытаюсь достичь, поэтому для этого есть мое редактирование.
Вот HTML:
<!DOCTYPE html>
<html>
<head>
<title>Testing case sensitive validations</title>
</head>
<body>
<form name = "newform" method = "post" action = "walkin.php">
Firstname <input type = "text" name = "fname"><br><br>
Nickname <input type = "text" name = "nname"><br><br>
Lastname <input type = "text" name = "lname"><br><br>
<input type = "submit" name = "submit" value = "Submit">
</form>
</body>
</html>
Вот PHP, который у меня есть до сих пор:
<?php
if (isset($_POST['submit'])) {
$fname = $_POST['fname'];
$nname = $_POST['nname'];
$lname = $_POST['lname'];
}
?>
Они до сих пор так работают
Как бы вы сделали это на другом языке, которым вы лучше владеете? Кроме того, пожалуйста, поделитесь тем, что вы сказали, что пробовали.
во-первых: избегайте w3schools для изучения PHP. Он пронизан расплывчатостью и плохой практикой. Там написано учебник по PHP5... какая версия? 5.4 сильно отличается от 5.6.. плюс учитесь 7. во-вторых: Отступы помогут быстрее читать код. в-третьих: исследовательское регулярное выражение
Как и в случае со всеми новыми языками, начать нужно с Руководство по PHP, строковые функции, и пока вы будете искать что-то, что поможет решить эту проблему, вы узнаете еще 20 вещей.
Ответ на удивление прост. Вы можете использовать комбинацию стртуппер, стртоловер и substr со строгим сравнением.
$firstLetterUppercase = 'A_word';
if (substr($firstLetterUppercase, 0, 1) === strtoupper(substr($firstLetterUppercase, 0, 1))) {
// first letter is upper case
}
$nickNameLowerCase = 'nickname';
if ($nickNameLowerCase === strtolower($nickNameLowerCase)) {
// it's lower case
}
$lastName = 'ALL UPPER CASE';
if ($lastName === strtoupper($lastName)) {
// it's upper case
}
Если их смешивать и сочетать, можно добиться чего угодно.
Обратите внимание, что здесь нет разницы между свободным и строгим сравнением, но всегда приятно использовать строгое сравнение.
Это вернет true, если первый символ в верхнем регистре. а $str — это строка, которую вы хотите проверить.
preg_match("/^[A-Z]/", $str );
вы можете сделать так, если вам нужно преобразовать всю строку в верхний регистр,
if ( preg_match("/^[A-Z]/", $str ) ){
$str = strtoupper("$str");
echo $str;
}
аналогичным образом вы можете преобразовать строку в нижний регистр, используя strtolower()
Обратите внимание, что OP не спрашивает, как преобразовать все нижние или все верхние, а как определить, является ли строка все нижняя или вся верхняя.
Чтобы проверить первую букву в верхнем регистре, попробуйте ниже
preg_match("/^[A-Z]/", 'Bamboozler');// This will return true if first letter is upper case
Чтобы проверить все символы строки в нижнем регистре, вы можете использовать функцию ctype_lower()
ctype_lower('bamboozler');// This will return true if all the character are lower cases.
Чтобы проверить все символы строки в верхнем регистре, вы можете использовать функцию ctype_upper()
ctype_upper('BOOM');// This will return true if all the character is upper cases.
Общая функция проверки регистра.
Не нужно использовать preg_match()
или substr()
. Вы можете напрямую получить доступ к первому символу, используя метод индекса строки {0}
. Если вам нужен второй символ, используйте {1}
.
function checkFirstLetter($str,$upper=true) {
if ($upper) {
return ($str{0} == strtoupper($str{0}));
} else {
return ($str{0} == strtolower($str{0}));
}
}
$test[] = array("str" => "test", "case" => true);
$test[] = array("str" => "Test", "case" => true);
$test[] = array("str" => "test", "case" => false);
$test[] = array("str" => "Test", "case" => false);
$test[] = array("str" => "123", "case" => true);
$test[] = array("str" => "123", "case" => false);
$test[] = array("str" => "!@#", "case" => true);
$test[] = array("str" => "!@#", "case" => false);
foreach($test as $k => $v) {
echo 'str:['.$v['str'].']
upper:['.$v['case'].']
result:['.checkFirstLetter($v['str'],$v['case']).']<br />';
}
И результаты:
str:[test] upper:[1] result:[]
str:[Test] upper:[1] result:[1]
str:[test] upper:[] result:[1]
str:[Test] upper:[] result:[]
str:[123] upper:[1] result:[1]
str:[123] upper:[] result:[1]
str:[!@#] upper:[1] result:[1]
str:[!@#] upper:[] result:[1]
Редактировать:
Мне очень нравится вариант ctype_upper($str)
и ctype_lower($str)
, но вам нужно будет установить это расширение, а мне нет. Если у вас есть это расширение, вы можете сделать:
if (ctype_upper($str{0})) {
// is upper first
}
Существуют также ucfirst()
и ucwords()
- оба могут помочь в зависимости от вашего вопроса, если вы хотите принудительно ввести стандарт синтаксиса для пользовательского ввода без необходимости сообщать об ошибках.
Я также немного смущен тем, почему StackOverflow удалил функцию, чтобы выделить ваш код и сделать Ctrl + K, чтобы добавить четыре пробела в каждой строке, почему они избавились от этого ярлыка?