使用preg_replace使序数以小写形式出现

时间:2013-09-06 12:03:48

标签: php string case-sensitive

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

坎布里亚之家3楼

223室,2楼

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

坎布里亚之家3楼

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

但它没有达到预期的效果,并完全按照它首次出现的方式输出。

由于

2 个答案:

答案 0 :(得分:2)

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

此示例有效(尽管它使用匿名函数进行回调,这需要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

答案 1 :(得分: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之后执行sting的一部分。