查看字串是否主要包含大寫字母的最佳方法是什么?
該字串還可能包含符號、空格、數字,因此在這些情況下仍希望它回傳 true。
例如:我可以通過類似于以下內容檢查字串是否為全大寫:
if (strtoupper($str) == $str) { /* its true */ }
但是如果我們需要確定一個字串是否為 80% 或更多的 ALL-CAP。
15 只棕色小狐貍跳進燃燒的谷倉!->真的
15 只小棕狐跳進燃燒的谷倉!->假的
我可以遍歷所有字符,單獨檢查它們,但這似乎有點浪費恕我直言。
有沒有更好的辦法?
uj5u.com熱心網友回復:
$countUppercase = strlen(preg_replace('/[^A-Z] /', '', $str));
// or: mb_strlen(...)
...然后除以strlen($str)
uj5u.com熱心網友回復:
一個簡單的 for 回圈應該提供最好的性能
$numUpper = 0;
for ($i = 0; $i < strlen($str); $i ){
if (ctype_upper($str[$i])) {
$numUpper ;
}
}
return $numUpper;
uj5u.com熱心網友回復:
我想嘗試其他方法并得出這樣的結論。老實說,我可能只是寫一個回圈。比這樣的內容更清楚,您可以省略數字和其他計入“小寫”的內容。
不過,只要稍微按摩一下您的輸入,您就可以按照這些思路做一些事情,只需比較兩個字串之間的差異。
<?php
isMostlyUpperCase('THE 15 SMALL BROWN FOXES JUMP INTO THE BURNING barn!');
isMostlyUpperCase('The 15 Small Brown Foxes JUMP Into the Burning Barn!');
function isMostlyUpperCase($strIn) {
$strAsUpper = str_split(strtolower($strIn));
$str = str_split($strIn);
$diff = array_diff_assoc($str, $strAsUpper);
return (count($diff) > strlen($strIn) - count($diff));
}
我添加了基于其他兩個答案的功能示例:
<?php
$str1 = 'THE 15 SMALL BROWN FOXES JUMP INTO THE BURNING barn!';
$str2 = 'The 15 Small Brown Foxes JUMP Into the Burning Barn!';
function pregIsMostlyUpper($str)
{
$countUppercase = strlen(preg_replace('/[^A-Z] /', '', $str));
$countLowercase = strlen(preg_replace('/[^a-z] /', '', $str));
return (bool)($countUppercase > $countLowercase);
}
function loopIsMostlyUpper($str)
{
$numUpper = 0;
$numLower = 0;
for ($i = 0;$i < strlen($str);$i )
{
if (ctype_alpha($str[$i]))
{
if (ctype_upper($str[$i]))
{
$numUpper ;
} else {
$numLower ;
}
}
}
return (bool)($numUpper > $numLower);
}
var_dump(loopIsMostlyUpper($str1)); //true
var_dump(loopIsMostlyUpper($str2)); //false
var_dump(pregIsMostlyUpper($str1)); //true
var_dump(pregIsMostlyUpper($str2)); //false
如果你愿意,我會讓你計時!嘗試擊敗 sed / awk 解決方案。
uj5u.com熱心網友回復:
另一種選擇可能是使用preg_match_all,它回傳完整模式匹配的數量和mb_strlen。
該模式\p{Lu}匹配具有小寫變體的大寫字母。
例如:
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;
}
輸出
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: false
查看PHP 演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433685.html
