¿Cuál es la mejor manera de ver si una cadena contiene principalmente letras mayúsculas?
La cadena también puede contener símbolos, espacios, números, por lo que aún querría que devolviera verdadero en esos casos.
Por ejemplo: puedo verificar si una cadena está TODO EN MAYÚSCULAS con algo similar a esto:
if (strtoupper($str) == $str) { /* its true */ }Pero, ¿qué sucede si necesitamos determinar si una cadena tiene un 80 % o más de TODAS MAYÚSCULAS?
¡LOS 15 ZORROS MARRONES PEQUEÑOS SALTAN AL ESTABLO EN LLAMAS! -> cierto
¡Los 15 pequeños zorros marrones SALTAN al granero en llamas! -> falso
Puedo recorrer todos los caracteres, revisándolos individualmente, pero eso parece un poco inútil en mi humilde opinión.
¿Hay una mejor manera?
$countUppercase = strlen(preg_replace('/[^AZ]+/', '', $str)); // or: mb_strlen(...)... y luego dividir por strlen($str)
Un bucle for simple debería dar el mejor rendimiento
$numUpper = 0; for ($i = 0; $i < strlen($str); $i++){ if (ctype_upper($str[$i])) { $numUpper++; } } return $numUpper;Otra opción podría ser usar preg_match_all , que devuelve el número de coincidencias de patrones completos y mb_strlen .
El patrón \p{Lu} coincide con una letra mayúscula que tiene una variante en minúscula.
Por ejemplo:
function mostlyUpperInString($s, $threshold) { return preg_match_all("/\p{Lu}/u", $s) / mb_strlen($s) > $threshold; } function moreUpperThanLower($s, $threshold) { return preg_match_all("/\p{Lu}/u", $s) / preg_match_all("/\P{Lu}/u", $s) > $threshold; } $strings = [ "THE 15 SMALL BROWN FOXES JUMP INTO THE BURNING barn!", "The 15 Small Brown Foxes JUMP Into the Burning Barn!" ]; foreach ($strings as $str) { echo $str . " -> 80% mostlyUpperInString: ". (mostlyUpperInString($str, 0.8) ? "true" : "false") . PHP_EOL; echo $str . " -> 80% moreUpperThanLower: ". (moreUpperThanLower($str, 0.8) ? "true" : "false") . PHP_EOL; echo PHP_EOL; }Producción
THE 15 SMALL BROWN FOXES JUMP INTO THE BURNING barn! -> 80% mostlyUpperInString: false THE 15 SMALL BROWN FOXES JUMP INTO THE BURNING barn! -> 80% moreUpperThanLower: true The 15 Small Brown Foxes JUMP Into the Burning Barn! -> 80% mostlyUpperInString: false The 15 Small Brown Foxes JUMP Into the Burning Barn! -> 80% moreUpperThanLower: falseVea una demostración de PHP .