【问题标题】:How Can I search a string based on a specific criteria and replace a specific value using regex如何根据特定条件搜索字符串并使用正则表达式替换特定值
【发布时间】:2016-02-02 17:24:27
【问题描述】:

我正在尝试查找出现在某些单词之后的字符串中的数字,并将前导零放在数字前面。

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

【问题讨论】:

  • 您是否希望添加0 只是为了使它们成为位数字?
  • 是的,我只想添加前导 0 以使其成为 4 位数字。

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


【解决方案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 单词边界,以确保我们只匹配整个单词并稍微优化了正则表达式。

【讨论】:

  • 您的解决方案要好得多。
【解决方案2】:

我想出了一个答案。我改用 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
            );

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2014-02-08
    • 2018-02-09
    • 2021-11-20
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多