如何使用strpos匹配大部分单词?

时间:2017-10-17 21:33:11

标签: php

我试图回显每个数组键的测量单位的名称。

问题在于,有时候键值会有缩写,正如我在haystack变量中的最后一个键值中所示。

$haystack = array(
    '15.1 ounces white chocolate',
    '1 ounce olive oil',
    '½ cup whipping cream',
    '1 tablespoon shredded coconut',
    '1 tablespoon lemon',
    '1 oz water'
);

$needles = 
    array(
        '0' => array(
            'id' => '1',
            'name' => 'cup',
            'abbreviation' => 'c'
        ), 
        '1' => array(
            'id' => '2',
            'name' => 'ounce',
            'abbreviation' => 'oz'
        ), 
        '2' => array(
            'id' => '3',
            'name' => 'teaspoon',
            'abbreviation' => 'tsp'
        ), 
        '3' => array(
            'id' => '4',
            'name' => 'tablespoon',
            'abbreviation' => 'tbsp'
    )
);

foreach($haystack as $hay){
    foreach($needles as $needle){
        if(strpos($hay, $needle['name']) !== false || strpos($hay, $needle['abbreviation']) !== false){
            $names[] = $needle['id'];
        }
    }
}

上面的代码返回以下结果(http://codepad.org/yC47JLeC):

Array
(
    [0] => cup
    [1] => ounce
    [2] => cup
    [3] => ounce
    [4] => cup
    [5] => cup
    [6] => tablespoon
    [7] => tablespoon
    [8] => ounce
)

我想要完成的是让它返回以下结果(http://codepad.org/MZXNOGnr):

Array
(
    [0] => 2
    [1] => 2
    [2] => 1
    [3] => 4
    [4] => 4
    [5] => 2
)

但要让它返回"工作"代码,我不得不在缩写字符前放一个1,这样strpos就不会匹配那些不正确的字符。

1 个答案:

答案 0 :(得分:2)

缩写' c'为了杯子'太过分了。您需要检查它是否完整。您可以通过在空格中嵌入搜索字符串来实现这一点,因此请查找" c "而不是"c",或者使用正则表达式并匹配字边界。

请注意,如果你改变了,你将不得不添加'盎司'杯子'和'汤匙' (复数形式)也针,否则你无法找到它们。实际上,我不会写一个缩写词,而是会保留一系列变体'对于每个单元,所以你得到类似的东西:

$needles = 
    array(
        '0' => array(
            'id' => '1',
            'name' => 'cup',
            'variations' => array('cups', 'cup', 'cp', 'c')
        ), 
    ...

然后,您可以搜索每个针的每个变体。