PHP:对照文本文件检查用户输入?

PHP:对照文本文件检查用户输入?,php,regex,compare,Php,Regex,Compare,我在文本文件中有以下街道名称和门牌号: 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”

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

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”的形式)搜索此列表,并返回一个是/否响应,无论该房屋是否存在于边界内

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


谢谢你的帮助

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

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

查找街道使用的号码的步骤

David Ln:(.*)
然后使用

[^,]*

您只需将文件导入字符串即可。完成此操作后,在数组中对文件的每一行进行break,以便
数组(第1行=>array(),第2行=>array()
等)。完成此操作后,您可以使用
进行分解。之后,您只需在数组中搜索。这不是最快的方法,但可能比regex更快


<>你应该真诚地考虑使用一个数据库或重新思考你的文件是怎样的。

试试这样的方法,把你的街道名称放在测试中。现在你可以在文本文件中获取细节,只与你在表单中提交的值进行比较。

 $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;
                    }

                }
            }
        }

如前所述,使用数据库存储与街道名称相关的街道编号是理想的。我认为可以通过文本文件实现这一点的方法是创建一个2D数组;将街道名称存储在第一个数组中,并将有效的街道编号存储在各自的数组中

在循环中逐行解析文件。解析街道名称并存储在数组中,然后使用嵌套循环解析所有数字(对于像
1414-1420
这样的范围内的数字,可以使用附加循环来获取该范围内的每个数字)并在初始street name数组元素中构建下一个数组。当您拥有2D数组时,您可以执行一个简单的嵌套循环来检查它是否匹配

我将尝试为您编写一个小的伪代码

伪代码:

$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++;
}

最好将街道存储在一个单独的带有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只运行一个查询


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

有什么理由不能使用数据库,即使它是sqlite?如果伪代码不好,那就很抱歉。我只是希望它能帮助您提供实现思路,因为实现似乎就是您要找的。它不是有效的代码。