_array/strpos中的Php不起作用-如何找到';精确';比赛?

_array/strpos中的Php不起作用-如何找到';精确';比赛?,php,arrays,regex,Php,Arrays,Regex,好的 我在盲目地开发一个“大”产品web应用程序 我们有几千种产品,每种产品都有一组数据元素,这些数据元素来自多个供应商,格式各异。。。所以,不用说,我们看不到数据 这是今天问题的简短版本 我们想从“产品名称”中提取“尺寸” $product_name = "Socket Assembly w/ 25 ft Lamp Cord - 14 Gauge "; 这是“尺寸数组的一部分…” $lookForTheseSizes = array( ...'Gallon','gal','Gal','G',

好的

我在盲目地开发一个“大”产品web应用程序

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

这是今天问题的简短版本

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

$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个值,它是动态构建的,可能会在不通知的情况下随新值的添加而更改

因此,这个脚本并不总是有效的…因为它取决于大小数组值的排序方式

foreach ($lookForTheseSizes as $key => $value){
    if (strpos( $nameChunk,$value) !== false) { 

        echo 'match '.$nameChunk.' => '.$value.'<br/>';                 

        $size = $value; 
        break;
    }
}
foreach($lookForTheseSizes为$key=>$value){
如果(strpos($nameChunk,$value)!==false){
回显“匹配”。$nameChunk.=>。$value.
; $size=$value; 打破 } }
例如,$nameChunk=“Gauge”…脚本首先在“g”上返回一个“match”

所以…我的问题是。。。 有没有一种方法-正则表达式或标准PHP5.4或更好的函数-在不首先对数组大小排序的情况下进行提取查找/匹配

$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";
}
或者


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

是什么阻止您对大小数组进行排序?这可能是一种“极端情况”,也可能不是。我有8-10家供应商,拥有10K以上的产品,每个供应商都有自己的名称“系统”…我不想处理所有这些…下面Cherry的答案需要您的支持..因为“iU”“在他的正则表达式中。。。这意味着阵列不是一个问题…谢谢大家。。。我可能需要把你放到工资单上。。。我不是一个“regex”的家伙+1代表“iU”+1用于捕获多个事件。。。这个脚本放在一个大得多的脚本中,“连词”-“w/25英尺灯线”已经被提取出来。因此$nameChunk是干净的…我只需要知道“单词”是否是“大小”…v“4包”还有其他地方我需要所有大小的中庭。一个问题…如果没有“数字”怎么办"... $产品名称=“BioBizz Bio Bloom加仑”?您的正则表达式将如何修改以捕获“加仑或加仑”。@BillWarren使用
(?P[\d.]+)?
/U
修饰符在这里并不真正需要,但它不会影响结果。
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);
  [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"
  }