如何根据特定条件搜索字符串并使用正则表达式

时间:2016-02-02 17:24:28

标签: regex preg-replace preg-match preg-match-all preg-replace-callback

我试图在某些字词后面找到一个字符串中的数字,并在数字前面放置前导零。

例如。 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;

2 个答案:

答案 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字边界,以确保我们只匹配整个单词并优化正则表达式。