如何在PHP中检测字符串是否包含一个大写字母

36

找不到这个功能,我假设我需要使用正则表达式?

我正在尝试在php中进行html重定向,在url包含至少一个大写字母的情况下。

例如:http://www.domain.com/Michael_Jordan 需要被重定向到 http://www.domain.com/michael_jordan - 唯一的问题是我似乎找不到一个脚本来检测是否存在至少1个大写字母。


这是我被要求做的一件事,以改善SEO - 更改URL站点结构 - 过去的URL中有大写字母 - 因此我们正在尝试在过渡到新URL时保留这些URL的页面强度。 - Bob Cavezza
@Bob:我懂了,这就解释了。 - RageZ
2
谷歌或其他搜索引擎是否真正考虑域名的大小写? - deceze
1
对于域名我们不是很确定,但我们更担心页面中的尾部文本。例如,许多URL都是篮球运动员的名字,并且原始链接都是以First_Last格式命名的,我们正在将其更改为first_last,显然这里有一个区别-关于域名不是100%确定。http://www.wisegeek.com/are-urls-case-sensitive.htm - Bob Cavezza
1
对于 URL 的本地部分(域名之后的所有内容)区分大小写是有意义的。如果您想要重写这些部分,那么这个问题就有意义。如果仅针对域名,我不会担心它。 - deceze
显示剩余3条评论
5个回答

63

可以使用一些正则表达式来完成工作,您可以使用preg_match[A-Z]

if(preg_match('/[A-Z]/', $domain)){
 // There is at least one upper
}

4
至少有一个大写字母。 - zerkms
4
“+” 完全是不必要的。 - eyelidlessness
3
请注意,现今域名不仅包含美式字母。因此,这个方法在大多数情况下可行,但并非全部情况都适用。例如,这是一个有效的丹麦网址:www.rødgrødmedFLØDE.dk。 - Lasse Espeholt
@luckydonald 给 PCRE 正则表达式添加 U 标志,这样应该就可以了,但还未验证。 - RageZ

35
if (strtolower($url) != $url){
  //etc...

1
相对于什么?像这样简单的事情重新发明轮子只是愚蠢的。 - Tyler Eaves
1
与正则表达式相反,我认为更语义化的解决此问题的方法是使用正则表达式(因为正则表达式本身描述了我们所做的事情)。 - zerkms
4
使用正则表达式来解决这个问题是一种过度设计的定义,更不用说开销相当高了。 - Tyler Eaves
5
假设您有一个10MB大小的文本。使用 strtolower 函数需要一定的时间才能执行,但是正则表达式会在第一次遇到大写字母时就返回true。 - zerkms
1
使用 mbstring 扩展中的 mb_strtolower() 来使其适用于非 ASCII 字符。首先设置编码。 - jlh
显示剩余8条评论

7
你可以尝试这个。
if (!ctype_lower($string)) {
    // there is at least une uppercase character
}

不确定这种方法是否比其他两种方法更有效。


我觉得这是更直接的答案,因为它是 PHP 中已经存在的一个函数。 - Anther
6
这将仅对包含字母字符的字符串起作用。例如,它不会对字符串 the quicknoupper1 起作用。 - FixMaker

4
preg_match_all('%\p{Lu}%u', 'aA,éÁ,eE,éÉ,iI,íÍ,oO,óÓ,öÖ,őŐ,uU,úÚ,üÜ,űŰ', $m);
echo '<pre>';
var_dump($m);
echo '</pre>';

测试使用匈牙利utf-8字符,[A-Z]仅适用于latin1。

0
这里是一个更简单的例子:
$mydir = "C:\Users\John" ;

print preg_match('/^[A-Z]:\.*/', $mydir, $match )."\n" ;
print $match[0]. " preg match \n" ;

生成:

1
C: preg match

这表明括号并不是必需的——至少对于一个匹配而言。
为了更具体地适用于您的应用程序,请查看此内容:如何使用PHP在字符串中搜索大小写混合单词?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接