我试图在某些字词后面找到一个字符串中的数字,并在数字前面放置前导零。
例如。 Apt 4,John Ave应该 Apt 0004,John Ave Lane Drive 52号块应 Block 0052 Lane Drive
注意:我只想添加前导0以使其成为4位数字
我的代码部分工作但是它正在用前导零替换它找到的所有数字。我认为preg_replace应该能够以更好的结果实现这一目标。
$s = '23 St John Apt 92 rer 4, Wellington Country Block 5 No value test 54545 tt 232';
preg_match_all('/Apartment\s[0-9]+|Apt\s[0-9]+|Block\s[0-9]+|Department\s[0-9]+|Lot\s[0-9]+|Number\s[0-9]+|Villa\s[0-9]+/i', $s, $matches);
var_dump ($matches);
foreach($matches[0] as $word)
{
preg_match_all('!\d+!', $word, $matches2);
foreach($matches2[0] as $value)
{
$value = trim($value);
if(strlen($value) == 1)
{
$s= str_replace($value, "000".$value, $s);
}
else if(strlen($value) == 2)
{
$s= str_replace($value, "00".$value, $s);
}
else if(strlen($value) == 3)
{
$s= str_replace($value, "0".$value, $s);
}
else
{
//nothing
}
}
}
echo $s;
答案 0 :(得分:1)
我找到了答案。我使用了preg_replace_callback。
echo preg_replace_callback("/Apartment\s[0-9]+|Apt\s[0-9]+|Block\s[0-9]+|Department\s[0-9]+|Lot\s[0-9]+|Number\s[0-9]+|Villa\s[0-9]+/i",
function($matches){
$word = explode(" ", $matches[0]);
$value = $word[1];
var_dump($word);
if(strlen($value) == 1)
{
return $word[0]. " 000".$value;
}
else if(strlen($value) == 2)
{
return $word[0]. " 00".$value;
}
else if(strlen($value) == 3)
{
return $word[0]. " 0".$value;
}
else
{
//nothing
}
},
$string
);
答案 1 :(得分:1)
您可以使用str_pad
功能:
用另一个字符串将字符串填充到一定长度
代码:
$re = '/\b((?:Apartment|Apt|Block|Department|Lot|Number|Villa)\s*)([0-9]+)/i';
$str = "23 St John Apt 92 rer 4, Wellington Country Block 5 No value test 54545 tt 232";
$result = preg_replace_callback($re, function($m){
return $m[1] . str_pad($m[2],4,"0", STR_PAD_LEFT);
}, $str);
echo $result; // <= 23 St John Apt 0092 rer 4, Wellington Country Block 0005 No value test 54545 tt 232
请参阅demo
我还在开头添加了\b
字边界,以确保我们只匹配整个单词并优化正则表达式。