我有一列地址数据,其序号如下所示:
坎布里亚之家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>";
但它没有达到预期的效果,并完全按照它首次出现的方式输出。
由于
答案 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的一部分。