好的..
我在一个“大”产品网络应用程序上盲目工作......
我们有几千种产品,每种产品都有来自多个供应商的各种格式的数据元素......所以,不用说,我们看不到数据......
这是今天问题的简短版本......
我们想从“产品名称”中提取“尺寸”
$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'上返回“匹配”....
所以......我的问题是...... 有没有一种方法-regex或标准的PHP 5.4或更好的功能 - 做一个提取查找/匹配...没有先排序Sizes数组?
答案 0 :(得分:1)
$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
)。