在二维数组上实现 preg_replace()

问题描述 投票:0回答:3

我有一个相对较大的元素数组,我想搜索字符串并替换任何匹配项。我目前正在尝试使用

preg_replace
和正则表达式来做到这一点:

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

我想获取与

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

文档说

preg_replace
应该能够接受数组源 - 这就是我问的原因。

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

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

php arrays regex multidimensional-array preg-replace
3个回答
16
投票

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
)否则原始数组将不会被修改。


1
投票

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

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);
}

1
投票

您的

$array
包含一些其他数组。
preg_replace
适用于字符串数组,但不适用于字符串数组[数组...]。

© www.soinside.com 2019 - 2024. All rights reserved.