_array/strpos中的Php不起作用-如何找到';精确';比赛?
好的 我在盲目地开发一个“大”产品web应用程序 我们有几千种产品,每种产品都有一组数据元素,这些数据元素来自多个供应商,格式各异。。。所以,不用说,我们看不到数据 这是今天问题的简短版本 我们想从“产品名称”中提取“尺寸”_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',
$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"
}