如何根据特定条件搜索字符串并使用正则表达式替换特定值
How Can I search a string based on a specific criteria and replace a specific value using regex
我试图在字符串中查找出现在某些单词之后的数字,并在数字前面放置前导零。
例如。 Apt 4, John Ave 应该是 Apt 0004, John Ave
Block 52, Lane Drive 应该是 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;
我找到了答案。我改用 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
);
您可以使用str_pad
函数:
Pad a string to a certain length with another string
代码:
$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
单词边界以确保我们只匹配整个单词并对正则表达式进行了一些优化。
我试图在字符串中查找出现在某些单词之后的数字,并在数字前面放置前导零。
例如。 Apt 4, John Ave 应该是 Apt 0004, John Ave Block 52, Lane Drive 应该是 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;
我找到了答案。我改用 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
);
您可以使用str_pad
函数:
Pad a string to a certain length with another string
代码:
$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
单词边界以确保我们只匹配整个单词并对正则表达式进行了一些优化。