簡體   English   中英

PHP in_array / strpos不起作用-如何找到“完全匹配”?

[英]Php in_array / strpos does not work - How to find an 'exact' match?

好..

我正在盲目使用“大型”產品網絡應用程序...

我們有成千上萬的產品,每個產品都帶有來自多個供應商的各種格式的數據元素……因此,不用說,我們看不到數據...

這是今天問題的簡短版本...

我們要從“產品名稱”中提取“尺寸”

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

這是“ Sizes數組的一部分...。

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

當前具有大約100個值的Sizes數組是動態構建的,可能會隨着添加新值而更改,恕不另行通知。

因此,此腳本並不總是有效的……因為它取決於Sizes數組值的排序方式。

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

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

        $size = $value; 
        break;
    }
}

例如,當$ nameChunk =“ Gauge” ...時,腳本首先在'g'上返回“ match”。

所以...我的問題是...有沒有辦法-regex或標准php 5.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"
  }

我會從數組中刪除區分大小寫的重復單元,並在正則表達式中使用其他修飾符i (它將是/iU而不是/U )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM