2

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

3楼,坎布里亚楼

2楼223室

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

3楼,坎布里亚楼

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>";

但它没有达到预期的效果,并完全按照最初出现的方式输出该行。

谢谢

4

2 回答 2

2

我认为您需要使用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
于 2013-09-06T12:14:10.237 回答
0
<?php

    $ordinalregex = '/(\d+)(st|nd|rd|th)/ei';
    $input = "Room 223, 2Nd Floor";

    $input = preg_replace($ordinalregex, "strtolower('$1$2')", $input);

    print($input);

/e 修饰符告诉解释器使用 eval。现在这有效,但它不安全。如果您的输入由于 C 错误而具有 \0(空字符),则解释器将执行 \0 之后的字符串部分。

于 2013-09-06T12:13:55.907 回答