Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Все ли буквы в строке - прописные?
Форумы портала PHP.SU » PHP » Регулярные выражения » Все ли буквы в строке - прописные?

Страниц (1): [1]
 

1. LML - 09 Декабря, 2021 - 01:01:19 - перейти к сообщению
Задача - выдать предупреждение, если строка $umsg написана полностью прописными буквами.
Если в строке прописных букв меньше, чем их разрешённое количество, находятся цифры, или хоть одна строчная буква - предупреждения нет.
Я решил это таким способом:

PHP:
скопировать код в буфер обмена
  1. if(mb_strlen($umsg) > jjBot_Caps_Lock && preg_match('/^D+$/', $umsg) && mb_strtoupper($umsg) === $umsg) {


В конфиге задаётся


Вроде всё красиво. Но, если пишут просто знаки препинания или с пробелами, например А..... - условие срабатывает.
И ещё какой-то глюк с цифрами тоже вылезал. Пришлось заменить

на
PHP:
скопировать код в буфер обмена
  1. !preg_match('/\d+/u', $umsg)

А, чтобы не считались точки и пробелы - сделал так:
PHP:
скопировать код в буфер обмена
  1. if(mb_strlen(preg_replace('/[[:punct:][:blank:]]/', '', $umsg)) > jjBot_Caps_Lock && !preg_match('/\d+/u', $umsg) && mb_strtoupper($umsg) === $umsg) {


Я не силён в регулярках, поэтому вопрос - нормально сделано условие, или его можно упростить, чтобы было меньше регулярок в одном условии?
2. Хенаро - 26 Мая, 2022 - 23:57:11 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $umsg = "ААААА";
  3. echo mb_strlen($umsg); // выдаёт 10
  4. if(preg_match("/^[А-ЯЁA-Z]{5}$/u", $umsg) || preg_match("/[^\w]/usi", $umsg) || preg_match("/.{6,}/usi", $umsg)) {
  5.   echo "NO";
  6. }
  7.  

Попробуй так)
3. Vladimir Kheifets - 27 Мая, 2022 - 13:04:50 - перейти к сообщению
Хенаро пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $umsg = "ААААА";
  3. echo mb_strlen($umsg); // выдаёт 10
  4. if(preg_match("/^[А-ЯЁA-Z]{5}$/u", $umsg) || preg_match("/[^\w]/usi", $umsg) || preg_match("/.{6,}/usi", $umsg)) {
  5.   echo "NO";
  6. }
  7.  

Попробуй так)

Добрый день!
Видимо Вы не обратили внимание на то, что ответили на вопрос от 09 Декабря, 2021
Может и правильно. Форум что-то затих...
Попробуйте так
PHP:
скопировать код в буфер обмена
  1. function checkUperCaseStr($str, $maxUperCaseCh){
  2.   if(preg_match('/^\p{Lu}+$/u', $str)) //в строке только прописные буквы
  3.     return 1;
  4.   else
  5.   {
  6.     preg_match_all('/\p{Lu}/u', $str, $matches);
  7.     $kUperCaseCh = count($matches[0]); //кол-во прописных букв
  8.     //кол-во прописных букв не больше $maxUperCaseCh и есть цыфры или строчные буквы
  9.     if($kUperCaseCh <= $maxUperCaseCh AND preg_match('/(\d|\p{Ll})/u', $str))
  10.       return 0;
  11.     else
  12.       return 2;
  13.   }
  14. }
  15.  
  16. $TestStr = [
  17.   "MЬNCHEN", //здесь U-умляут, не Ь
  18.   "Октоберфест в Мюнхене",
  19.   "МОСКВА",
  20.   "Москва",
  21.   "СРЕДА 25 мая",
  22.   "СРЕДА 25 Mая",
  23.   "1 мая",
  24.   "FREITAG 27.05.2022"
  25. ];
  26. $maxUperCaseCh=5;
  27. foreach($TestStr as $str)
  28. {
  29.   echo "$str : ". checkUperCaseStr($str, $maxUperCaseCh)."<br>";
  30. }
  31.  
  32. /*
  33. MЬNCHEN : 1
  34. Октобефест в Мюнхене : 0
  35. МОСКВА : 1
  36. Москва : 0
  37. СРЕДА 25 мая : 0
  38. СРЕДА 25 Mая : 2
  39. 1 мая : 0
  40. FREITAG 27.05.2022 : 2
  41. */
  42. ?>
Удачи!
4. Хенаро - 27 Мая, 2022 - 14:56:24 - перейти к сообщению
Ну так конечно посолиднее будет Улыбка
5. LML - 28 Мая, 2022 - 16:01:03 - перейти к сообщению
Спасибо всем огромное за идеи!

Vladimir Kheifets пишет:

Видимо Вы не обратили внимание на то, что ответили на вопрос от 09 Декабря, 2021

Вопрос, в принципе, ещё актуальный.

 

Powered by ExBB FM 1.0 RC1