我想用PHP(邮政地址(做一些验证。
例如,验证地址和邮政编码的第一行:
123 Some Road
和
W3 1TJ
这两个字段都有一个数字、字母和一个空格。
我已经尝试了几种正则表达式模式,但它不接受空间,这是我需要帮助的地方。
这是我到目前为止使用的代码:
$address1CheckPattern = '/^[a-z0-9-]+$/';
$adress1HasError = !preg_match($address1CheckPattern, $address1);
这在一般情况下有效。但并非所有地址行 1 都有一个数字,有些只有一个名字。例如房屋名称,街道名称
如果您对正则表达式感到满意,并且您只想让它接受一个空格。向正则表达式添加空格
$add_check = '/^[a-z0-9- ]+$/i';
但它仍然不是匹配地址的好方法。使用从皇家邮政获取真实数据的公共 API 将是最好的。Google API(免费但速率有限(或任何地方的邮政编码等付费服务对您来说会更好
完全回答这个问题,但我曾经有过验证邮政编码的使命
为此,我构建了以下正则表达式;希望对您有所帮助。
正如我之前有些人所说,没有办法验证给定国家/地区的每个地址,更不用说在地球上了! 它必须是一个通用的文本字段,也许只是检查你不需要的字符:"?<>=;@$%^*!" 并清理输入以免注入 SQL。
在我的应用程序中,邮政编码是根据国家/地区字段进行测试的,但如果您知道您将只测试选定的几个,您可以将一些放在一起例如:美国/英国 = /^(['d]{5}(-['d]{4})?)|([A-Z]?[A-Z][0-9][A-Z0-9]?'s[0-9][A-Z]{2})/
Afghanistan,Angola,Belize,Benin,Hong Kong,Ireland, Macau
no Postal Code
Argentina
^[A-Z][0-9]{4}[A-Z]{3}$
Canada
^(?!.*[DFIOQU].*)([A-Z][0-9]){3}$
US
^['d]{5}(-['d]{4})?$
UK
^[A-Z]?[A-Z][0-9][A-Z0-9]?'s[0-9][A-Z]{2}$
Latvia
^LV[-'s]?['d]{4}$
Hungary,Denmark,Cyprus,Georgia,Bangladesh,Austria,Armenia,Australia,Albania,Belgium,Bulgaria,Cape Verde,Philippines,Paraguay
Norway,New Zealand,Liechtenstein,Luxembourg,South Africa,Tunisia,Switzerland
^['d]{4}$
Netherlands
^['d]{4}'s[A-Z]{2}$
Portugal
^['d]{4}['s-]['d]{3}$
Israel,Iraq,Indonesia,Greece,Germany,Guam,Croatia,Costa Rica,Estonia,Egypt,France,Finland,American Samoa,Algeria
Brazil,Bosnia and Herzegovina,Cambodia,Palau,Morocco,Montenegro,Northern Mariana Islands,Lithuania,Italy,Malaysia
Mexico,Marshall Islands,Micronesia,Serbia,Puerto Rico,San Marino,Taiwan,Thailand,Spain,Sri Lanka,Turkey,Ukraine,U.S. Virgin Islands,Vatican
^['d]{5}$
Poland
^['d]{2}['s-]?['d]{3}$
Czech Republic, Slovakia, Sweden
^['d]{3}['s-]?['d]{2}$
Iran
^['d]{5}['s-]['d]{5}$
China,Colombia,Belarus,Panama,Pakistan,Nigeria,Kazakhstan,Singapore,Romania,Russia
^['d]{6}$
地址行中的特殊字符呢?
在德国,街道名称中经常有一个"-",或者德语中的"街道"一词与"str."一起被取消 - 所以行中有一个点。当我不得不处理工作的德语地址时,我不得不处理诸如"NW 10 Straße 39b","Elsa-Brandström-Str 128 Haus 3"等线路。
邮政编码也是如此。我 德国 我们有 5 个数字 - 简单,但其他国家也有字母数字字符,例如您的示例"W3 1TJ"等。
所以我会说,地址行没有一般的验证。
只需在方括号中放置空格,即可在可接受的字符中包含空格。所以它看起来像这样:
$add_check = '/^[a-zA-Z0-9- ]+$/';
这就是你要找的吗?
请注意,我还在正则表达式中添加了"A-Z"范围:您可能希望允许地址包含大写字母,除非您已经将地址减少到全部小写或其他内容。
我还建议在字符类中添加一个点,因为可能会出现"st."和"ave."等缩写。那么它看起来像这样:
$add_check = '/^[a-zA-Z0-9-. ]+$/';
您的正则表达式仅包含字母和数字,没有用于检查空格或制表符的规定尝试遵循正则表达式的工作原理
$add_check = '/^'s*[a-z0-9's]+$/i';
if(!preg_match($add_check,$address1)) {
$error_message .= '&add1=Please enter a valid Address Line 1.';
}
我从字面上理解了这个问题,如果一个地址有一个门牌号,一个空格,那么一个道路名称。
//address first line [1 pass 3 fails]
$add_check = '/[0-9] [a-zA-Z]/';
echo preg_match($add_check,"123 Some Road");
echo preg_match($add_check,"Some Road");
echo preg_match($add_check,"123Some Road");
echo preg_match($add_check,"2ND Road");
邮政编码有一些字母,一些数字和空格,一些数字,最后是更多的字母
//UK type postal code [1 pass 3 fails]
$add_check = '/[a-zA-Z][0-9] [0-9][a-zA-Z]/';
echo preg_match($add_check,"W3 1TJ");
echo preg_match($add_check,"W 1TJ");
echo preg_match($add_check,"W3 1");
echo preg_match($add_check,"3 1TJ");
当然,如果我不是住在"1 The Road",而是住在"myHouse,The Road"。哎哟该怎么处理那个逗号,数字发生了什么。这可能是将 validateAddressLine($address( 放入函数中的好时机,以便以后可以对其进行改进。并在每次日志消息为 false 时保存日志消息,然后您可以检查您是否阻止了某种您意想不到的格式。[这也意味着你不应该对html验证过于严格,让服务器检查并记录它。
这是我最近为一个基本网站制作的一些功能。它是基本的,不会查找邮政编码以查看是否存在,或检查邮政编码结构是否正确(字母:数字:字母等(。它只允许 A-z0-9 和您所说的空格(某些地址使用逗号或撇号,可以很容易地添加到正则表达式中(。
我添加了一个允许空间的功能,它不会检查它可以检查的各种事情,例如空间是否在正确的位置,或者如果只有一个,我不需要任何这些对于基本站点,随意修改你需要的地方。
//Address validation
function fnc_address_validation($strFncAddress)
{
if (strlen($strFncAddress) > 50)
{
return '50 characters maximum';
}
elseif (strlen($strFncAddress) < 5)
{
return '5 characters minimum';
}
elseif (preg_match("/^[A-z0-9 ]+$/", $strFncAddress) != 1)
{
return 'Invalid characters: Allowed 0-9, A-z, space';
}
else
{
return false;
}
}
//Postcode validation without space
function fnc_postcode_validation($strFncPostcode)
{
if (preg_match("/^[A-z0-9]+$/", $strFncPostcode) != 1)
{
return 'Invalid characters: Allowed A-z, 0-9';
}
elseif (strlen($strFncPostcode) > 7)
{
return '7 characters maximum';
}
elseif (strlen($strFncPostcode) < 4))
{
return '4 characters minimum';
}
else
{
return false;
}
}
//Postcode validation with space
function fnc_postcode_validation($strFncPostcode)
{
if (preg_match("/^[A-z0-9 ]+$/", $strFncPostcode) != 1)
{
return 'Invalid characters: Allowed A-z, 0-9, 1 space';
}
elseif (strlen($strFncPostcode) > 8)
{
return '8 characters maximum';
}
elseif (strlen($strFncPostcode) < 5))
{
return '5 characters minimum';
}
else
{
return false;
}
}
英国最大的邮政编码(不带空格(是 7 个字符 (AFAIK(,因此请注意,当最后一个函数中允许空格时,strlen 接受 5-8。
然后在表单页面上,类似
$strPostAddress = $_POST['address'];
$strPostPostcode = $_POST['postcode'];
$strCheckAddress = fnc_address_validation($strPostAddress);
$strCheckPostcode = fnc_postcode_validation($strPostPostcode);
if ($strCheckAddress === false && $strCheckPostcode == false)
{
//do whatever as all ok - insert into DB etc
}
echo '<p>Address <input type="text" name="address" size="35" maxlength="50"
value="'.$strPostAddress.'"> '.$strCheckAddress.'</p>';
echo '<p>Postcode <input type="text" name="postcode" size="35" maxlength="8"
value="'.$strPostPostcode.'"> '.$strCheckPostcode.'</p>';
您也可以将函数上的 return = false 更改为文本,如果您希望表单验证每个字段是否为"Ok"。只需检查是否所有字符串都是 == "确定"。
在这一侧,有一些针对不同国家的正则表达式:http://www.pixelenvision.com/1708/zip-postal-code-validation-regex-php-code-for-12-countries/
荷兰的正则表达式与 Georges Brisset 提供的正则表达式具有相同的问题。它应该是:
'/[1-9][0-9]{3} ?[a-zA-Z]{2}/'.
Georges Brisset为您提供了很多正则表达式,这很棒。您可以创建一个属性文件,并在需要验证时从此文件中获取正确的正则表达式并使用它测试输入。
此类文件的内容如下所示:
us=/.../
uk=/.../
nl=/.../
ge=/.../
键值是一个国家的官方缩写。该列表可以在这里找到:http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_names_and_code_elements.htm
之后,您只需使用以下方法读取文件:
$expressions = file('expressions.txt');
以数组形式返回文件的内容。接下来,您遍历列表(我会说您根据您必须测试特定国家/地区的邮政编码的机会对列表进行排序(并在 = - 字符后执行表达式。
$address1CheckPattern = '^[a-zA-Z0-9][a-zA-Z0-9- ,()'/]*$';
//consider following type also
// new part 5/12, georgia
// 12 old street -10
// old stree block 4 (b)
$adress1HasError = !preg_match($address1CheckPattern, $address1);
如果将空格放在连字符之前,它应该可以工作:
$address1CheckPattern = '/[^A-Za-z0-9_ -]/';
在连字符之后,它将被解释为从下划线到空格的范围。
希望对:)有所帮助
对于荷兰的街道名称,我建议:
'^[a-zA-Z]+'s[0-9]+[a-zA-Z]?$'
其中 [a-zA-Z]+ 是街道名称
''s 街道名称和数字
之间的空格[0-9]+ 街道名称
后的所有数字[a-zA-Z]?数字之后可能的附加组件
可能的街道名称:
Amsterdamseweg 2<br>
Hilversumsestraat 38a
要验证邮政编码,您可以使用这样的东西,在这种情况下是西班牙邮政编码验证,但您可以在 https://rgxdb.com/r/3EZMSVWM
$add_check = '/^(?:0[1-9]|[1-4]'d|5[0-2])'d{3}$/';
if(!preg_match($add_check, $postal_code)){
//error
}