【问题标题】:Using preg_replace on an array在数组上使用 preg_replace
【发布时间】:2014-03-21 08:38:56
【问题描述】:

我有一个相对较大的元素数组,我想搜索一个字符串并替换任何匹配项。我目前正在尝试使用preg_replace 和正则表达式来做到这一点:

preg_replace("/\d?\dIPT\.\w/", "IPT", $array);

我想获取与00IPT.A0IPT.A 匹配的所有值(0 代表任何数字字符,A 代表任何字母)并将它们替换为IPT。但是,我收到了数组到字符串的转换通知。有没有办法让preg_replace 接受数组数据源?如果没有,还有其他方法可以实现吗?

文档说preg_replace 应该能够接受数组源——这就是我要问的原因。

要搜索和替换的字符串或带有字符串的数组。 如果subject为数组,则对subject的每一项进行查找替换,返回值也是数组。

如果有帮助,该数组是多维的(在一个主数组下有多个数组)。

【问题讨论】:

    标签: php regex arrays preg-replace


    【解决方案1】:

    preg_replace 没有就地修改。要永久修改$array,只需将preg_replace 的结果赋值给它即可:

    $array = preg_replace("/\d{1,2}IPT\.\w/", "IPT", $array);
    

    为我工作。

    $array = array('00IPT.A', '0IPT.A');
    $array = preg_replace("/\d{1,2}IPT\.\w/", "IPT", $array);
    var_dump($array);
    // output: array(2) { [0]=> string(3) "IPT" [1]=> string(3) "IPT" }
    

    注意:\d{1,2} 表示一位或两位数。

    如果你想对一个二维数组做这个,你需要遍历第一个维度:

    $array = array( array('00IPT.A', 'notmatch'), array('neither', '0IPT.A') );    
    foreach ($array as &$row) {
        $row = preg_replace("/\d{1,2}IPT\.\w/", "IPT", $row);
    }
    var_dump($array);
    

    输出:

    array(2) { 
        [0]=> array(2) { 
            [0]=> string(3) "IPT" 
            [1]=> string(8) "notmatch" 
        } 
        [1]=> &array(2) { 
            [0]=> string(7) "neither" 
            [1]=> string(3) "IPT" 
        } 
    }
    

    请注意,您必须通过引用 (&$row) 遍历每一行,否则原始数组将不会被修改。

    【讨论】:

    • 这是否适用于多维数组?我的数组是这样组织的: array(4500) { [0]=> array(19) { [0]=> string(0) "" [1]=> string(32) "SNIP" [2]=>字符串(0) "" [3]=> 字符串(0) "" [4]=> 字符串(0) "" [5]=> 字符串(0) "" [6]=> 字符串(0) "" }
    • 您要对哪些元素执行替换?全部?
    • 我想替换与正则表达式搜索词匹配的所有元素的值。我列出的数组之后的一些数组包括: string(5) "9IPT.A" [4]=> string(3) "TEA" [5]=> string(2) "BT" [6]=> string(5 ) "10RC1" [7]=> string(3) "IRE" [8]=> string(2) "A3" [9]=> string(5) "10RC1" 所以一个例子是让 10RC1 保持不变但改变9IPT.A 到 IPT。这可能吗?
    【解决方案2】:

    您的值不是作为简单元素而是作为子集存在于数组中,对吗?像这样?

    array (
      array ('id' => 45, 'name' => 'peter', 'whatyouarelookingfor' => '5F'),
      array ('id' => 87, 'name' => 'susan', 'whatyouarelookingfor' => '8C'),
      array ('id' => 92, 'name' => 'frank', 'whatyouarelookingfor' => '9R')
    )
    

    如果是这样:

    <?php
    
    foreach ($array as $key => $value) {
      $array[$key]['whatyouarelookingfor'] =  
        preg_replace("/\d?\dIPT\.\w/", "IPT", $value['whatyouarelookingfor']);
    }
    

    或者如果更多的元素有这个,那就更广泛:

    <?php
    
    foreach ($array as $key => $value) {
      $array[$key] =  
        preg_replace("/\d?\dIPT\.\w/", "IPT", $value);
    }
    

    【讨论】:

      【解决方案3】:

      您的$array 包含更多数组。 preg_replace 适用于字符串数组,但不适用于字符串数组 [of arrays...]。

      【讨论】:

      • 哦,所以 preg_replace 不适用于多维数组? Dam,那你知道解决办法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多