Php 如何将所有单词改为大写,但不包括罗马数字?

Php 如何将所有单词改为大写,但不包括罗马数字?,php,regex,Php,Regex,我正在尝试修复一些手动键入的地址。我需要申请整个地址,但我想保留所有大写罗马数字和门牌号后的字母 通过PIPPO III 74A 应成为: 通过Pippo III 74A 如何实现这一点?通过以下方式选择字符串的大写部分: 完整示例,如何修复手动键入的地址,将单词的第一个字母大写,并保留大写罗马数字和门牌号后的字母a、B、C): 使用a查找非罗马数字的单词: /\b(?![LXIVCDM]+\b)([A-Z]+)\b/ 说明: \b-在单词边界处断言位置 (?!-负前瞻 [LXIVCD

我正在尝试修复一些手动键入的地址。我需要申请整个地址,但我想保留所有大写罗马数字和门牌号后的字母

通过PIPPO III 74A
应成为:

通过Pippo III 74A

如何实现这一点?

通过以下方式选择字符串的大写部分:

完整示例,如何修复手动键入的地址,将单词的第一个字母大写,并保留大写罗马数字和门牌号后的字母a、B、C):

使用a查找非罗马数字的单词:

/\b(?![LXIVCDM]+\b)([A-Z]+)\b/
说明:

  • \b
    -在单词边界处断言位置
  • (?!
    -负前瞻
    • [LXIVCDM]+
      -将列表中的任何字符匹配一次或多次
    • \b
      -在单词边界处断言位置
  • -负前瞻结束
  • [A-Z]
    -任何大写字母,一次或多次
  • \b
    -在单词边界处断言位置
实际上,它匹配的是任何不完全由列表中的字符组成的单词,也就是说,它匹配的是任何不是罗马数字的单词


现在,使用捕获这些单词,将其转换为小写,然后将第一个字母大写:

$input = 'VIA PIPPO III 74A';    
$pattern = '/\b(?![LXIVCDM]+\b)([A-Z]+)\b/';

$output = preg_replace_callback($pattern, function($matches) {
    return ucfirst(strtolower($matches[0]));
}, $input);

var_dump($output);
输出:

string(17)“通过Pippo III 74A”

我已经删除了答案末尾的广告。如果您有自己的网站想要展示,请将其添加到StackOverflow bio中。+1
preg\u replace\u callback
确实是正确的方法。
/\b(?![LXIVCDM]+\b)([A-Z]+)\b/
$input = 'VIA PIPPO III 74A';    
$pattern = '/\b(?![LXIVCDM]+\b)([A-Z]+)\b/';

$output = preg_replace_callback($pattern, function($matches) {
    return ucfirst(strtolower($matches[0]));
}, $input);

var_dump($output);