搜索到文本文件,如果包含字符串php,则获取Line文本

时间:2018-02-23 12:50:55

标签: php

我的文字文件包含这样的文字

A8-30-AD   (hex)        WEIFANG GOERTEK ELECTRONICS CO.,LTD
A830AD     (base 16)        WEIFANG GOERTEK ELECTRONICS CO.,LTD
            Wei fang Export processing Zone
            Wei Fang  Shan Dong  261205
            CN

D8-68-C3   (hex)        Samsung Electronics Co.,Ltd
D868C3     (base 16)        Samsung Electronics Co.,Ltd
            #94-1, Imsoo-Dong
            Gumi  Gyeongbuk  730-350

此文件包含所有mac地址及其供应商。 我想搜索到这个文件,如果行包含我搜索的mac地址我希望得到它的供应商 例如,如果我搜索

  

A8:30:AD

mac地址到此文件中它将返回

  潍坊高尔特电子有限公司

所以我只想找到找到(hex)字符串的供应商名称 我怎么能用PHP

来做到这一点

2 个答案:

答案 0 :(得分:0)

您的文件包含内容

的行
  

key [space](type)[space] name

你想要好吗"名字"通过"键"

  1. 所以你可以使用preg-match-all()http://php.net/manual/ru/function.preg-match-all.php这样的模式来搜索所需的行

      

    / ^ $搜索\ S + \(。*?\)\ S +(。*)?\ $ /米

    如果你想按键的一部分进行搜索,可以将键包裹在"。*?"

      

    /^.*?$搜索范围。*?\ S + \(。*?\)\ S +(。*)?\ $ /米

  2. 因为文件中包含的内容只有字母和数字,所以你可以通过

    来清除你的搜索内容
      

    / \ W + /

    并仅按这些行搜索

  3. 所以你编码

    $search='A8:30:AD'; // search string;
    $filename='data.txt'; // name of file with data
    
    
    
    $search=preg_replace('/\W+/','',$search); // clear search, remove non-letters and non-digits
    $filecontent = file_get_contents($filename);
    
    $pattern = "/^$search\s+\(.*?\)\s+(.*)?\$/m"; //build the pattern
    
    if(preg_match_all($pattern, $filecontent, $matches)){ // if found
        // print_r($matches[1]); // show found array with all matches
        echo $matches[1][0]; // show only first found
    } else { 
        echo "nothing found";
    }
    

    你会得到

      潍坊高尔特电子有限公司

    按部分"键"进行搜索使用这个

    $pattern = "/^.*?$search.*?\s+\(.*?\)\s+(.*)?\$/m"; //build the pattern
    

答案 1 :(得分:0)

最简单的方法是读取文件并解析它,将mac地址和相应的供应商收集到一个数组中,并将mac地址行作为键。像$arr = ['mac-address1' => 'vedor1', ....]这样的东西。所以我们这样做

function getMacAddressVendor(string $mac_address) {
    static $database = NULL;
    if (is_null($database)) {
        $database = [];
        $handle = fopen('path to file', 'r');
        while ($line = fgets($handle)) {
            $matches = []; //we capture stuffs into this array
            $line = trim($line);
            //mac addresses are hexadecimals that may contain colon or dash
            if (preg_match('/^([A-E0-9\-:]+)\s+\([^)]+\)\s+(.+)$/i', $line, $matches) {
                $database[strtoupper($matches[1])] = $matches[2];
            }
        }
        fclose($handle);
    }
    return array_key_exists(strtoupper($mac_address), $database)? $database[$mac_address] : '';
}

$vendor = getMacAddressVendor('A8:30:AD');