在 php 中测试给定字符的大写或小写类型的最佳方法是什么?

2023-12-03

无论当前本地语言如何,检测字符是大写还是小写的理想方法是什么?

有没有更直接的功能?

假设:将内部字符编码设置为 UTF-8 并且本地浏览器会话是 en-US,en;q=0.5 并且已安装多字节字符串扩展。不要使用 ctype_lower 或 ctype_upper。

请参阅下面的测试代码,该代码应该是多字节兼容的。

$encodingtype = 'utf8';
$charactervalue = mb_ord($character, $encodingtype);

$characterlowercase = mb_strtolower($character, $encodingtype) ;
$characterlowercasevalue = mb_ord(mb_strtolower($character, $encodingtype));

$characteruppercase = mb_strtoupper($character, $encodingtype);
$characteruppercasevalue = mb_ord(mb_strtoupper($character, $encodingtype));



// Diag Info
echo 'Input: ' . $character . "<br />";
echo 'Input Value: ' . $charactervalue = mb_ord($character, $encodingtype) . "<br />" . "<br />";
echo 'Lowercase: ' . $characterlowercase = mb_strtolower($character, $encodingtype) . "<br />";
echo 'Lowercase Value: ' . $characterlowercasevalue = mb_ord(mb_strtolower($character, $encodingtype)) . "<br />" . "<br />";
echo 'Uppercase: ' . $characteruppercase = mb_strtoupper($character, $encodingtype) . "<br />";
echo 'Uppercase Value: ' . $characteruppercasevalue = mb_ord(mb_strtoupper($character, $encodingtype)) . "<br />" . "<br />";
// Diag Info


if ($charactervalue == $characterlowercasevalue and $charactervalue != $characteruppercasevalue){
    $uppercase = 0;
    $lowercase = 1;
    echo 'Is character is lowercase' . "<br />" . "<br />";
}

elseif ($charactervalue == $characteruppercasevalue and $charactervalue != $characterlowercasevalue ){
    $uppercase = 1;
    $lowercase = 0;
    echo 'Character is uppercase' . "<br />" . "<br />";
}

else{
    $uppercase = 0;
    $lowercase = 0;
    echo 'Character is neither lowercase or uppercase' . "<br />" . "<br />";
}
  • // 测试 1 A // 输出->字符为大写
  • // 测试 2 z // 输出->字符为小写
  • // 测试 3 + // 输出->字符为小写
  • // Test 4 0 // 输出->字符既不是小写也不是大写
  • // 测试 5 ǻ // 上面有环且尖音的拉丁文小写字母 A // 输出 -> 字符为小写
  • // 测试 6 Ͱ 希腊大写字母 HETA // 输出-> 字符为大写
  • // 测试 7 '' NULL // 输出->字符既不是小写也不是大写

我觉得最直接的方法是编写正则表达式模式来确定字符类型。

在下面的代码片段中,我将在第一个捕获组中搜索大写字母(包括 unicode),或在第二个捕获组中搜索小写字母。如果模式不匹配,则该字符不是字母。

正则表达式中 unicode 字母的一个很好的参考:https://regular-expressions.mobi/unicode.html

写入由管道分隔的两个捕获组意味着每种类型的字母将被插入到输出数组中的不同索引元素中。[0]是全字符串匹配(在本例中从未使用过,但它的生成是不可避免的)。[1]将保存大写匹配(或者当存在小写匹配时为空——作为占位元素)。[2]将保存小写匹配——只有在存在小写匹配时才会生成。

因此,我们可以假设 matches 数组中的最高键将决定字母的大小写。

如果输入的字符是非字母,preg_match()将返回错误结果0表示匹配的数量,当发生这种情况时0与查找一起使用来访问neither.

Code: (Demo) (图案演示)

$lookup = ['neither', 'upper', 'lower'];
$tests = ['A', 'z', '+', '0', 'ǻ', 'Ͱ', null];

foreach ($tests as $test) {
    $index = preg_match('~(\p{Lu})|(\p{Ll})~u', $test, $out) ? array_key_last($out) : 0;
    echo "{$test}: {$lookup[$index]}\n";
}

Output:

A: upper
z: lower
+: neither
0: neither
ǻ: lower
Ͱ: upper
: neither

对于尚未使用 php7.3 的任何人,您可以致电结束()然后键()像这样:

Code: (Demo)

foreach ($tests as $test) {
    if (preg_match('~(\p{Lu})|(\p{Ll})~u', $test, $out)) {
        end($out); // advance pointer to final element
        $index = key($out);
    } else {
        $index = 0;
    }
    echo "{$test}: {$lookup[$index]}\n";
}

我的第一种方法每次测试至少进行一次函数调用,最多进行两次调用。我的解决方案可以通过写成一行preg_调用里面的$lookup[ and ],但我的目标是可读性。


附注这是我想象的另一种变化。不同之处在于preg_match()由于最后一个空的“替代”(空分支),总是会匹配。

foreach ($tests as $test) {
    preg_match('~(\p{Lu})|(\p{Ll})|~u', $test, $out);
    echo "\n{$test}: " , $lookup[sizeof($out) - 1];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 php 中测试给定字符的大写或小写类型的最佳方法是什么? 的相关文章

  • 如何更新 PHP 中 xpath 的版本? [复制]

    这个问题在这里已经有答案了 可能的重复 XPath 2 0 和 或 XSLT 2 0 是否会在 PHP 中实现 https stackoverflow com questions 2085632 will xpath 2 0 and or
  • 使用 try {} catch {} 与 if {} else {} 相比有何优势

    我正在从 php 中的普通 mysql 切换到 PDO 并且我注意到测试错误的常见方法是使用 try catch 组合而不是 if else 组合 该方法的优点是什么 我可以使用一个 try catch 块而不是多个嵌套的 if else
  • 无法连接到 SMTP 服务器

    我有一个支持邮件的服务器 比如说example com 我配置了服务器并通过cpanel添加了MX记录 这样我就可以通过outlook com有地址 email protected cdn cgi l email protection MX
  • 阅读 Google 文档电子表格

    是否可以使用 PHP 从 Google Docs 电子表格中提取行 在 SQL 中我会使用类似的东西 SELECT FROM table WHERE field value LIMIT 1 有没有办法做到这一点 我听说你应该使用 Zend
  • dayname(curdate()) 不适用于 codeigniter php

    此 sql 在 phpmyadmin 中有效 但在 codeigniter php 中无效 function getProgramsHomepage data array this gt db gt select p name p star
  • Jquery 表单验证 - 电话号码

    我已经在表单上设置了 jQuery 验证 该验证当前测试电话号码字段不为空并且是一个数字 但我希望它能够处理用户在手机 区号后放置空格的情况 谁能建议我需要做什么才能允许这样做 这是我当前的代码 if phone length 0 name
  • WSDL PHP 函数返回 null,而其他函数返回预期结果

    Summary 在这里 我将列出我解决此问题所采取的所有步骤 以供其他人参考 1 PHP 很愚蠢地 监听 函数的输入消息来定义它应该使用哪个函数 因此 为每个函数提供不同的输入消息 即使它使用相同的类型或元素 您可能认为这对您来说是一项艰巨
  • Zoopla 沙箱出现 cURL http 标头错误

    我正在为房地产经纪人开发代码 以通过他们的数据源将房产上传到 Zoopla 我在将所需的配置文件添加到所需的 http 标头时遇到问题 文档中唯一的示例是来自 Linux 的测试 echo branch reference test cur
  • 从字符串中提取电子邮件地址

    我有一个像这样的字符串 Francesco Renga lt email protected cdn cgi l email protection gt 我只需要提取电子邮件 即 电子邮件受保护 cdn cgi l email protec
  • WooCommerce 从前端(而不是管理员)隐藏订单项元

    我有一些我不希望客户看到的订单项元详细信息 在帐户信息下的查看订单页面上 我找到了一个过滤器 可以从管理员 我仍然希望看到它 中删除这些数据 但找不到类似的过滤器来从前端 应该隐藏它 中删除它 这是将从后端管理中删除它的代码 对我来说毫无用
  • WooCommerce:返回特定类别中所有产品 ID 的函数

    我认为问题的标题是相当不言自明的 但要详细说明 我正在尝试在 Woocommerce 中制作自定义类别页面 我需要的是返回特定类别中的所有产品 ID 我见过这个帖子 https stackoverflow com questions 210
  • 用于验证网络路径的正则表达式 PHP、jQuery、JavaScript、Ruby

    尝试找出用于验证网络路径的正则表达式 即 comp xyz or comp or comp x y z storage或者所有部分都更长的东西 但希望能够传达其要点 我目前拥有的是一个简单的输入字段 用户可以通过它传递信息 事情是我不希望他
  • Magento - 无法重新索引产品价格 - 外键约束失败

    我最近刚刚将我的 magento 商店从 1 4 2 升级到 1 7 0 2 升级进行得很顺利 但是当我尝试在升级后重新索引数据时 产品价格失败了 我尝试过使用php shell indexer php reindexall来自 SSH 它
  • Laravel 5.1 date_format 验证允许两种格式

    我对传入的 POST 请求使用以下日期验证 trep txn date gt date format Y m d H i s u 这只允许这种日期 即 2012 01 21 15 59 44 8 我还想允许没有时间的日期 例如2012 01
  • 使用 Laravel 和 Eloquent 从表中选择全部

    我正在使用 Laravel 4 设置我的第一个模型 以从名为的表中提取所有行posts 在标准 MySQL 中我会使用 SELECT FROM posts 如何在 Laravel 4 模型中实现这一目标 我的完整模型源代码如下
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 将日期时间舍入到最后一小时

    我试图寻找这个 但我找不到我想做的事情的好例子 我在 MySQL 数据库中得到了日期时间值 当使用该值时必须向下舍入 例如 所有这些值 2013 04 20 07 14 422013 04 20 07 19 512013 04 20 07
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m
  • 在 PHP 数组定义中显示重复键警告

    下面的代码是否可以得到警告 error reporting E ALL s array a gt 1 a gt 1 var export s 你唯一的希望 除了count 你自己 是你的编辑足够聪明 可以突出显示拼写错误 此屏幕截图来自 P
  • 将 #RRGGBB 十六进制值转换为 #AARRGGBB

    414141 与 AARRGGBB 的值是什么 52b531 又如何 我如何使用 PHP 转换它 Regards 奔腾10 AA 是 Alpha 通道 直接转换是将 AA 设置为 FF 以使其完全不透明 414141 becomes FF4

随机推荐

  • jupyter笔记本中没有python终端

    Attached a screenshot of the error I have tried creating python 3 and python2 virtualEnv but nothing is working Any help
  • QThread 不能很好地工作

    这是 QTread 的子对象 并将其具体化在主线程中 运行时错误如下 QCoreApplication sendEvent 中的 ASSERT 失败 无法将事件发送到 不同线程拥有的对象 当前线程 176f0a8 接收者 类型为 MainW
  • 如何配置 WAMP (localhost) 使用 Gmail 发送电子邮件?

    我想使用本地主机的 mail 函数 我安装了 WAMP 并拥有 Gmail 帐户 我知道Gmail的SMTP是smtp gmail com 端口是465 来自 Gmail 的更多信息 我需要在 WAMP 中配置什么才能使用 mail 函数
  • 三星 Galaxy S5 相机手电筒不工作

    我们有一款适用于所有支持的 Android 手机的应用程序 三星 Galaxy S5 除外 我们的应用程序使用相机近距离拍照 在我们集中注意力拍照的整个过程中 我们需要开启手电筒模式 我们检查支持的参数并设置值 如果支持 参数已设置 但事件
  • 使用 gspread 库检查工作簿是否存在?

    如何使用 gspread 库检查工作簿是否存在 我的问题是 如果我第二次运行 gspread create title 它不会重写前一个文件 而是创建另一个同名的文件 有什么办法可以避免它吗 谢谢 石油 你可以检查它尝试 除外 GC ope
  • IoC 容器中的自绑定是什么?

    我见过像 Ninject 这样的框架以及 Stack 上的帖子谈到使用依赖注入框架时的自绑定 如下面的代码所示 Bind
  • 为什么 IsNaN(x) 与 x == NaN 不同,其中 x = NaN [重复]

    这个问题在这里已经有答案了 为什么这两个不同 var x NaN e g Number e alert isNaN x true good alert x NaN false bad Nothing等于NaN 任何比较都会是false 在严
  • 扩展 django-import-export 的导入表单,为每个导入行指定固定值

    我正在使用 django import export 1 0 1 与 Django 2 1 1 中的管理集成 我有两个型号 from django db import models class Sector models Model cod
  • Git,重新定位错误分支的分支

    git clone blah git checkout b development git checkout b bug581 hack hack git checkout b bug588 hack hack 哦等等 bug 588 应该
  • 缺少 Google Awareness API v9.6

    我对新的地图样式功能感兴趣 该功能在 9 6 Google Play 服务版本中添加 但我也在使用 Awareness API 在我的build gradle I have compile com google android gms pl
  • Reader(StaxEventItemReader) 资源到域对象

    我想将输入资源位置作为字符串传递到域对象的字段 我的配置如下
  • 访问损坏的共享库

    这是代码cpuid2 s cpuid2 s view the cpuid vendor id string using c library calls section data output asciz The processor Vend
  • Apache Thrift 教程中的 C++ 链接器错误 - 未定义的符号

    我正在运行 Apache 的 Thrift 教程 http wiki apache org thrift ThriftUsageC 2B 2B我的 Thrift 版本是 0 9 1 我使用的是 OS X 我在本教程中搜索了类似的问题 虽然其
  • r - 如何根据另一列的数值序列动态添加列[重复]

    这个问题在这里已经有答案了 如何根据另一列的数值序列在数据框中动态添加列 我想添加n根据另一列的值将列转换为数据帧 我拥有什么以及我想要拥有什么 我有这个 head df x y 1 1 ola 2 2 ola 3 3 ola 4 5 ol
  • HTML 到图像 .tiff 文件

    有没有办法将 HTML 字符串转换为 Image tiff 文件 我正在使用 C NET 3 5 要求是为用户提供进行确认的选项 确认是使用 XML 和 XSLT 创建的 通常是通过电子邮件发送的 有没有办法可以获取由转换 HTML 字符串
  • docker-compose 中卷的权限

    我想创建带有卷和自定义组的 docker 容器 但在容器内遇到权限错误 所有文件都具有例如 自定义组 并且工作正常 但文档文件夹默认具有根组 我认为这是由于数量所致 如何将文档文件夹设置为 自定义组 我的代码如下 volumes base
  • javascript Node.js next()

    我看到很多用处next在 Node js 中 它是什么 它从哪里来 它有什么作用 我可以在客户端使用它吗 抱歉 这里使用的是 http dailyjs com 2010 12 06 node tutorial 5 查找 loadUser 函
  • 多域、单节点(express)应用程序

    我正在尝试创建简单的节点应用程序 用户可以在其中创建配置文件 默认情况下 他的个人资料的 url 应类似于 user1 myappname com 但是当用户填写自定义域输入 并将该域指向我的应用程序 IP 地址 时 他应该能够使用此自定义
  • 如何在数据表中的第一列标题添加垂直线?

    我想在 DT 表列标题中添加一条垂直线 有在帖子中添加此行的指导如何向数据表添加垂直线 但它适用于手动设置列的静态表 而在我的 MWE 代码 底部 中 列是使用lapply 在反应性设置中起作用 因此 在我的特定情况下 我在使用本指南时遇到
  • 在 php 中测试给定字符的大写或小写类型的最佳方法是什么?

    无论当前本地语言如何 检测字符是大写还是小写的理想方法是什么 有没有更直接的功能 假设 将内部字符编码设置为 UTF 8 并且本地浏览器会话是 en US en q 0 5 并且已安装多字节字符串扩展 不要使用 ctype lower 或