当他们以撇号开头时将城市名称大写

时间:2014-07-02 12:55:56

标签: php regex

当他们以撇号开头时,我对(荷兰)城市名称的正确大写有一个问题。例如,我可以有名字:

'S-HERTOGENBOSCH或's gravendeel或'T Harde

我想做的是将所有内容改为小写,然后在前缀'S或'或'T之后将后面的字母大写。所以结果应该是:

's-Hertogenbosch和's Gravendeel和't Harde

我正在考虑使用Regex来做到这一点,但我还不确定应该如何做到这一点。有人能指出我正确的方向吗?

谢谢!

5 个答案:

答案 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]*形式的内容。从左到右

  • &#39;文字'
  • (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

搜索字符串匹配:

  • 直撇号,
  • 后跟字符st,在任何情况下标记为反向引用为字符串1,
  • 标记为反向引用的单个非单词字符为字符串2,
  • 标记为反向引用的单个字符,为字符串3,
  • 标记为反向引用的一个或多个其他单词字符或连字符为字符串4。

替换字符串:

  • 保留撇号,
  • 首先标记字符串(在任何情况下,字符st)转换为小写,
  • 第二个标记的字符串未修改,
  • 第三个标记的字符串(城市名称的第一个单词字符)转换为大写字母,
  • 第四个标记的字符串转换为小写。

替换字符串中的特殊字符的说明:

  • \l ...只将下一个字符转换为小写字母。
  • \u ...只将下一个字符转换为大写字母。
  • \L ...将所有字符转换为\E为小写。
  • \U ...将所有字符转换为\E为大写。

注意:案例转换仅适用于ASCII字母A-Za-z,不适用于特定语言的本地化字母,如德语变音符号,带重音字符等。