【问题标题】:PHP: check user input against text file?PHP:根据文本文件检查用户输入?
【发布时间】:2012-06-13 21:23:20
【问题描述】:

我在一个文本文件中有以下街道名称和门牌号:

Albert Dr: 4116-4230, 4510, 4513-4516
Bergundy Pl: 1300, 1340-1450
David Ln: 3400, 4918, 4928, 4825
Garfield Av: 5000, 5002, 5004, 5006, 8619-8627, 9104-9113
....

此数据代表当地社区的边界数据(即社区内有哪些房屋)。

我想制作一个 PHP 脚本,它将接受用户的输入(以“4918 David Lane”或“3000 Bergundy”之类的形式)搜索此列表,并返回一个是/否响应是否该房子存在于其中边界。

解析输入(正则表达式?)并将其与文本列表进行比较的有效方法是什么?

感谢您的帮助!

【问题讨论】:

标签: php regex compare


【解决方案1】:

最好将此信息存储在数据库中,这样您就不必从文本文件中解析出数据。正则表达式通常也不适用于查找范围内的数字,因此也建议使用通用语言。

但是...如果你想用正则表达式来做(看看为什么这不是一个好主意)

查找街道使用的数字

David Ln:(.*)

然后获取数字使用

[^,]*

【讨论】:

    【解决方案2】:

    您可以简单地将文件导入字符串。完成此操作后,将文件的每一行拆分为一个数组,如Array(Line 1=> array(), Line 2=> array() 等。完成此操作后,您可以使用: 分解。之后,您只需在数组中进行搜索。不是最快的方法,但它可能比正则表达式更快。

    您应该真诚地考虑使用数据库或重新考虑您的文件。

    【讨论】:

      【解决方案3】:

      试试这样,将您的街道名称放入 test.txt。现在您可以在文本文件中获取详细信息,只需将其与您在表单中提交的值进行比较。

       $filename = 'test.txt';
              if(file_exists($filename)) {
                  if($handle = fopen($filename, 'r')) {
                      $name = array();
                      while(($file = fgets($handle)) !==FALSE) {
                          preg_match('#(.*):(.*)#', $file, $match);
                          $array = explode(',', $match[2]);
                          foreach($array as $val) {
                              $name[$match[1]][] = $val;
                          }
      
                      }
                  }
              }
      

      【讨论】:

        【解决方案4】:

        如前所述,使用数据库存储与您的街道名称相关的街道编号是理想的选择。我认为你可以用你的文本文件来实现它的一种方法是创建一个二维数组;将街道名称存储在第一个数组中,并将有效街道编号存储在它们各自的数组中。

        在循环中逐行解析文件。解析街道名称并存储在数组中,然后使用嵌套循环解析 all 的数字(对于像 1414-1420 这样的范围内的数字,您可以使用额外的循环来获取range) 并在初始街道名称数组元素中构建下一个数组。当你有你的二维数组时,你可以做一个简单的嵌套循环来检查它是否匹配。

        我会尝试为你制作一些伪代码..

        伪代码:

        $addresses = array();
        $counter = 0;
        $line = file->readline
        while(!file->eof)
        {
          $addresses[$counter] = parse_street_name($line);
          $numbers_array = parse_street_numbers($line);
          foreach($numbers_array as $num)
            $addresses[$counter][] = $num;
        
          $line = file->readline
          $counter++;
        }
        

        【讨论】:

        • 很抱歉,如果伪代码很差。我只是希望它可以帮助您提供实现想法,因为看起来实现就是您正在寻找的东西。 这不是有效的代码。
        【解决方案5】:

        最好将街道存储在带有 ID 的单独表格中,并将数字存储在单独的表格中,每个范围或数字和街道 ID 对应一行。

        例如:

        streets:
        
        ID, street
        -----------
        1, Albert Dr
        2, Bergundy Pl
        3, David Ln
        4, Garfield Av
        ...
        
        houses:
        
        street_id, house_min, house_max
        -----------------
        1, 4116, 4230
        1, 4510, 4510
        1, 4513, 4516
        2, 1300, 1300
        2, 1340, 1450
        ...
        

        在没有范围只有一个门牌号的行中,您将最小值和最大值设置为相同的值。

        您可以编写一个脚本,该脚本将解析您的 txt 文件并将所有数据保存到数据库。这应该像几个循环和具有不同参数的explode() 和一些插入查询一样简单。

        然后通过第一个查询,您将获得街道 ID

        SELECT id FROM streets WHERE street LIKE '%[street name]%'
        

        然后你运行第二个查询并得到答案,那条街上是否有这样的门牌号码

        SELECT COUNT(*) 
        FROM houses 
        WHERE street_id = [street_id] 
            AND [house_num] BETWEEN house_min AND house_max
        

        在 [...] 中输入真实值,不要忘记转义它们以防止 sql 注入...

        或者您甚至可以使用 JOIN 只运行一个查询。

        另外你应该确保你给定的门牌号是整数,而不是浮点数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-27
          • 2015-01-11
          • 2021-11-21
          • 2015-12-14
          • 1970-01-01
          • 2015-07-06
          • 2016-05-09
          • 1970-01-01
          相关资源
          最近更新 更多