我在文本文件中有以下街道名称和门牌号码:
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”之类的形式)搜索此列表,并返回是/否响应,无论该房屋是否存在边界。
什么是解析输入(正则表达式?)并将其与文本列表进行比较的有效方法?
感谢您的帮助!
答案 0 :(得分:1)
最好将此信息存储在数据库中,这样您就不必解析文本文件中的数据。正则表达式通常也不适用于查找范围内的数字,因此也建议使用通用语言。
但是......如果你想用正则表达式来做(看看为什么它不是一个好主意)
查找街道使用的数字
David Ln:(.*)
然后使用
获取数字[^,]*
答案 1 :(得分:1)
您只需将文件导入字符串即可。完成此操作后,将数组的每一行打开,以便Array(Line 1=> array(), Line 2=> array()
等等。完成此操作后,您可以使用:
进行爆炸。之后,您只需要在数组中搜索。不是最快的方式,但它可能比正则表达式更快。</ p>
您应该真诚地考虑使用数据库或重新考虑您的文件。
答案 2 :(得分:0)
尝试这样的方法,将您的街道名称放在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;
}
}
}
}
答案 3 :(得分:0)
如上所述,使用数据库存储与街道名称相关的街道号码将是理想的选择。我认为你可以用你的文本文件实现这个方法就是创建一个2D数组;将街道名称存储在第一个阵列中,将有效的街道号码存储在各自的阵列中。
在循环中逐行解析文件。解析街道名称并存储在数组中,然后使用嵌套循环来解析所有数字(对于1414-1420
范围内的数字,您可以使用额外的循环来获取每个数字在范围内)并在初始街道名称数组元素中构建下一个数组。当你有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++;
}
答案 4 :(得分:0)
如果您将街道存储在具有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
...
在没有范围而是一个门牌号的行中,您将min和max都设置为相同的值。
您可以编写一个脚本,它将解析您的txt文件并将所有数据保存到db。这应该像几个循环一样容易,并且具有不同参数和一些插入查询的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运行一个查询。
此外,您应该确保您的给定门牌号是整数,而不是浮点数。