PHP 正则表达式从模式中删除不需要的值

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

我有一大堆抄袭的名称和价格,类似于以下内容:

Array([0] => apple3 [1] => £0.40 [2] => banana6 [3] => £1.80 [4] => lemon [5] => grape [6] => pear5 [7] => melon4 [8] => £2.32 [9] => kiwi [10] => £0.50)

我想删除那些没有立即跟上价格的水果名称。在上面的示例中,这将删除:

[4] => lemon [5] => grape [6] => pear5
,从而产生以下输出:

Array([0] => apple3 [1] => £0.40 [2] => banana6 [3] => £1.80 [7] => melon4 [8] => £2.32 [9] => kiwi [10] => £0.50)

如果需要将数组转换为字符串才能执行此操作,这不是问题,在数组项之间添加值以帮助正则表达式搜索也不是问题。到目前为止,我无法找到正确的正则表达式来使用 preg_match 和 preg_replace 来执行此操作。

最重要的因素是需要保持水果和价格的顺序,以便我在稍后阶段将其转换为水果和价格的关联数组。

提前致谢。

php regex preg-replace preg-match
7个回答
4
投票

为什么要涉及正则表达式?这可以通过一个简单的

foreach
循环来实现,其中您迭代数组并删除名称后面的名称:

$lastWasPrice = true; // was the last item a price?
foreach ($array as $k => $v) {
    if (ctype_alpha($v)) {
        // it's a name
        if (!$lastWasPrice) {
            unset($array[$k]); // name follows name; remove the second
        }
        $lastWasPrice = false;
    }
    else {
        // it's a price
        $lastWasPrice = true;
    }
}

1
投票

下面的代码可以同时完成两项任务:去掉没有价值的水果,并将结果转换为水果与价格的关联数组。

$arr = array('apple', '£0.40', 'banana', '£1.80', 'lemon', 'grape', 'pear', 'melon', '£2.32', 'kiwi', '£0.50' );

preg_match_all( '/#?([^£][^#]+)#(£\d+\.\d{2})#?/', implode( '#', $arr ), $pairs );
$final = array_combine( $pairs[1], $pairs[2] );

print_r( $final );

首先将数组转换为字符串,以'#'分隔。正则表达式捕获所有带有价格的水果组 - 每个水果组都作为单独的子组存储在结果中。将它们组合成关联数组是一个函数调用。


0
投票

这样的事情可能会对你有帮助

$array = ...;
$index = 0;

while (isset($array[$index + 1])) {
  if (!is_fruit($array[$index + 1])) {
    // Not followed by a fruit, continue to next pair
    $index += 2;
  } else {
    unset($array[$index]);  // Will maintain indices in array
    $index += 1;
  }
}

尚未测试。另外,您需要自己创建函数

is_fruit
;)


0
投票

如果不重新格式化,我认为您无法使用

preg_match
preg_replace
来做到这一点——也许,但什么也没有想到。

什么是创建该数组的?如果可能的话,我会把它改得更像:

Array([apple] => £0.40 [banana] => £1.80 [lemon] => [grape] => '' [pear ] => '' [melon  => £2.32 [kiwi] => £0.50)

那么

array_filter($array)
就是您清理它所需要的一切。如果您无法改变原始数组的创建方式,我倾向于从原始数组中创建键/值数组。


0
投票

只需这样做:

  <?php
for($i=0;$i<count($my_array);$i++)
{
if($my_array[$i+1]value=="")
unset($my_array[$i])
}
?>

0
投票

假设

$a
是你的数组。

function isPrice($str) {
    return (substr($str, 0, 1) == '£');
}
$newA = array();
for($i=0;$i<count($a);$i++) {
    if( isPrice($a[$i]) != isPrice($a[$i+1]) ){
        $newA[] = $a[$i];
    }
}

0
投票

尝试将模式 ** => ([a-zA-Z])** 替换为 ** => £0.00 $1**

基本上是搜索存在空价格的上下文并插入零英镑。

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