Php in_array / strpos 不起作用 - 如何找到'exact'匹配?



好的。。

我正在盲目地开发一款"大"产品网络应用程序。。。

我们有几千个产品,每个产品都有来自多个供应商的各种格式的数据元素。。。所以,不用说,我们看不到数据。。。

这是今天问题的简短版本。。。

我们想从"产品名称"中提取"尺寸"

$product_name = "Socket Assembly w/ 25 ft Lamp Cord - 14 Gauge ";

这是"尺寸阵列的一部分……

$lookForTheseSizes = array( ...'Gallon','gal','Gal','G','Gram','gram','g','gm','Gauge','gauge'... );

Sizes数组目前有大约100个值,它是动态构建的,可能会随着新值的添加而变化,而不会引起注意。

所以这个脚本并不总是有效的。。。因为它取决于Sizes数组值的排序方式。

foreach ($lookForTheseSizes as $key => $value){
    if (strpos( $nameChunk,$value) !== false) { 
        echo 'match '.$nameChunk.' => '.$value.'<br/>';                 
        $size = $value; 
        break;
    }
}

例如。。。当$nameChunk="仪表"时。。。脚本首先在'g'上返回一个"match"。。。。

所以。。。我的问题是。。。有没有一种方法——regex或标准php5.4或更好的函数——来进行提取查找/匹配。。。不先对Sizes数组进行排序?

$product_name = "Socket Assembly w/ 25 ft Lamp Cord - 14 Gauge ";
$lookForTheseSizes = array('Gallon', 'gal', 'Gal', 'G', 'Gram', 'gram', 'g',
                           'gm', 'Gauge', 'gauge', 'ft');
foreach($lookForTheseSizes as $unit)
{
    if (preg_match('/(?P<size>[d.]+)s*' . preg_quote($unit) . 'b/U', 
        $product_name, $matches))
       echo $matches['size'] . " " . $unit . "n";
}

结果

14 Gauge
25 ft

或者。。

$units = join('|' , array_map('preg_quote', $lookForTheseSizes));
if (preg_match_all('/(?P<size>[d.]+)s*(?P<unit>' . $units . ')b/U',
             $product_name, $matches))
  var_dump($matches);

看看$matches,做你想做的事。

  [0]=>
  array(2) {
    [0]=>
    string(5) "25 ft"
    [1]=>
    string(8) "14 Gauge"
  }
  ["size"]=>
  array(2) {
    [0]=>
    string(2) "25"
    [1]=>
    string(2) "14"
  }
  ["unit"]=>
  array(2) {
    [0]=>
    string(2) "ft"
    [1]=>
    string(5) "Gauge"
  }

我会从数组中抛出区分大小写的重复单元,并在regex中使用额外的修饰符i(它将是/iU而不是/U)。

最新更新