php - 使用 preg_replace 使序号全部小写

我有一列地址数据,其序号显示如下:

Cumbrian House 3 楼

2 楼 223 房间

当我希望它们像这样显示时:

3 楼,Cumbrian House

2 楼 223 房间

我正在尝试使用 preg_replace 函数将紧跟在数字后面的大写字母换成小写字母。 (我承认这是我第一次使用 preg_replace 函数。不过我对 preg_match 和正则表达式没问题)。

到目前为止我有:

$string = '3Rd Floor, Cumbrian House';

$ordinalregex = '/(^.*\d+)([A-Z])/';
$correctordinal = '$1'.strtolower('$2');

echo preg_replace($ordinalregex,$correctordinal,$string)."<br>";

但它并没有达到预期的效果,输出的线条与它第一次出现时完全一样。

谢谢

最佳答案

我认为你需要使用 preg_replace_callback因为我不确定您是否可以根据您在普通 preg_replace 中匹配的部分进行替换。您需要做的是使用一个回调函数,该函数接受匹配数组并对其进行处理(您也可以只使用 preg_match,然后单独处理匹配项)。

此示例有效(尽管它使用匿名函数进行回调,这需要 PHP 5.3.0+):

function fixOrdinals($string) { 
    return preg_replace_callback("/[0-9][A-Z]/",
        function ($matches) { 
            return strtolower($matches[0]);
        },
        $string
    );
}

echo fixOrdinals("3Rd Floor, Cumbrian House")."\n";
echo fixOrdinals("Room 223, 2Nd Floor")."\n";
echo fixOrdinals("4Th Room, 2Nd Floor")."\n";

输出:

3rd Floor, Cumbrian House
Room 223, 2nd Floor
4th Room, 2nd Floor

https://stackoverflow.com/questions/18657425/

相关文章:

ssis - Camel 与 ETL 工具

gcc - 编译外部内核模块时如何手动包含.config?

opengl-es - 没有属性的顶点着色器

php - 为什么 PHP-FPM 需要 5 分钟才能在我的服务器上重新启动?

google-cloud-storage - 将大文件上传到谷歌云存储时超时

image - 使用 gnuplot pm3d 和 pdf 输出生成的图像中有问题的莫尔图案

php - 在 PHPUnit 中测试工作链接

apache - 带加号的 URL 重定向

c# - RestSharp - 找不到

shell - 查找两个文件之间有多少行不同