当他们以撇号开头时,我对(荷兰)城市名称的正确大写有一个问题。例如,我可以有名字:
'S-HERTOGENBOSCH或's gravendeel或'T Harde
我想做的是将所有内容改为小写,然后在前缀'S或'或'T之后将后面的字母大写。所以结果应该是:
's-Hertogenbosch和's Gravendeel和't Harde
我正在考虑使用Regex来做到这一点,但我还不确定应该如何做到这一点。有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:2)
您可以使用preg_replace_callback
。
$city = strtolower("'T-HERTOGENBOSCH");
echo preg_replace_callback("/('(s|t)( |\-))([a-z])/", function($matches) {
return $matches[1] . ucfirst($matches[4]);
}, $city);
该模式使用多个subpatterns,其结果将在回调函数中重新组合:
('(s|t)( |\-)) # Apostrophe, then 's' or 't', then '<space>' or '-'
([a-z]) # The following lowercased character
请注意,我已将第一部分包装到另一个子模式中。这使得重新组装变得更加简单。
答案 1 :(得分:1)
首先,我想推荐regex101.com等网站。然后,让我们通过一个非常基本的正则表达式告诉你: - 你想要文字&#34;&#39;&#34;字符后面跟着你想要匹配的另一个字符&#39; uncapitalize&#39;, - 然后是一个完整的词
基本上,您需要匹配'(a-zA-Z)(?: |\-)[a-zA-Z]*
形式的内容。从左到右
'
(a-zA-Z)
字母表中的单个字符,小写或大写。是一个匹配组。(?: |\-)
空格或破折号。不是匹配组[a-zA-Z]*
字母表中的一系列字符。如果你想要这个东西也可以是(a-zA-Z)*
。既然您已经匹配了,那么您需要做的就是将其替换为非大写版本,例如使用PHP函数。
答案 2 :(得分:1)
尝试以下基于sanchises RegEx的功能(我稍微编辑了一下......):
function dutch_city_name($name) {
$name = strtolower(trim($name));
$matches = array();
preg_match("/'([a-z])( |-)[a-z]*/", $name, $matches);
if(count($matches) == 0) {
return $name;
}
return "'".$matches[1].$matches[2].ucfirst(substr($name, 3, strlen($name) - 3));
}
我尝试了它并且它正在工作。
答案 3 :(得分:0)
这是没有正则表达式的人。它只是检查第一个字符是否是撇号,如果是,则在搜索第一个字母大写时跳过撇号后的字符。
function capitalizeCityName($name) {
$name = strtolower(trim($name));
$i = ($name[0] === "'") ? 2 : 1;
for(; $i<strlen($name); $i++) {
if(ctype_alpha($name[$i])) {
$name[$i] = strtoupper($name[$i]);
break;
}
}
return $name;
}
print capitalizeCityName("'T Harde"); //'t Harde
print capitalizeCityName("Harde"); //Harde
答案 4 :(得分:0)
我不知道您要使用的PHP替换函数是否支持更改动态替换字符串上的字母大小写。但是后来在文本编辑器UltraEdit v21.10中使用了Perl正则表达式引擎。
搜索字符串:
'([STst])(\W)(\w)([\w\-]+)
替换字符串:
'\L\1\E\2\U\3\E\L\4\E
或
'\l\1\2\u\3\L\4\E
搜索字符串匹配:
s
或t
,在任何情况下标记为反向引用为字符串1,替换字符串:
s
或t
)转换为小写,替换字符串中的特殊字符的说明:
\l
...只将下一个字符转换为小写字母。\u
...只将下一个字符转换为大写字母。\L
...将所有字符转换为\E
为小写。\U
...将所有字符转换为\E
为大写。注意:案例转换仅适用于ASCII字母A-Za-z,不适用于特定语言的本地化字母,如德语变音符号,带重音字符等。