我想在 PHP(邮政地址)中进行一些验证。
例如,验证地址和邮政编码的第一行:
123 Some Road
和
W3 1TJ
这两个字段都有数字、字母和空格。
我尝试了几种正则表达式模式,但它不接受空格,这就是我需要帮助的地方。
这是我到目前为止使用的代码:
$address1CheckPattern = '/^[a-z0-9-]+$/';
$adress1HasError = !preg_match($address1CheckPattern, $address1);
我想在 PHP(邮政地址)中进行一些验证。
例如,验证地址和邮政编码的第一行:
123 Some Road
和
W3 1TJ
这两个字段都有数字、字母和空格。
我尝试了几种正则表达式模式,但它不接受空格,这就是我需要帮助的地方。
这是我到目前为止使用的代码:
$address1CheckPattern = '/^[a-z0-9-]+$/';
$adress1HasError = !preg_match($address1CheckPattern, $address1);
That works in a general case. But not all address line 1's have a number, Some just have a name. eg House Name, Street Name
if your happy with your regex and you just want it to accept a space. Add a space to the regex
$add_check = '/^[a-z0-9- ]+$/i';
But its still not a good way to match addresses. Using a public API which get real data from the royal mail will be the best. Google API (free but rate limited) or a paid for service like Postcode anywhere will be much better for you
不完全回答这个问题,但我曾经有过验证邮政编码的任务
为此,我建立了以下正则表达式;希望有帮助。
正如我之前所说的,没有办法验证给定国家/地区的每个地址,更不用说在地球上!它必须是一个通用的文本字段,也许只是检查你不想要的字符:"?<>=;@$%^*!" 并清理输入以免注入 SQL。
在我的应用程序中,邮政编码根据国家/地区字段进行了测试,但如果您知道您只会测试选定的几个,您可以将一些放在一起,例如:US/UK =/^([\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 个 digist - 很简单,但其他国家/地区也有字母数字字符,例如您的示例“W3 1TJ”等。
所以我会声称,地址行没有一般的验证。
我从字面上理解了这个问题,如果一个地址有门牌号,然后是一个空格,一个道路名称。
//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) 放入函数中的好时机,以便您以后改进它。并在每次它为假时保存一条日志消息,然后您可以检查您是否阻止了某些您不期望的格式。[这也意味着你不应该对 html 验证过于严格,让服务器检查并记录它。]
对于荷兰的街道名称,我建议:
\^[a-zA-Z]+\s[0-9]+[a-zA-Z]?$\
其中 [a-zA-Z]+ 是街道名称
\s 街道名称和数字
[0-9] 之间的空格 + 街道名称
[a-zA-Z] 之后的所有数字?数字后可能的附加组件
可能的街道名称:
Amsterdamseweg 2<br>
Hilversumsestraat 38a
您的正则表达式仅包含字母和数字,没有检查空格或制表符的规定尝试遵循正则表达式的工作
$add_check = '/^\s*[a-z0-9\s]+$/i';
if(!preg_match($add_check,$address1)) {
$error_message .= '&add1=Please enter a valid Address Line 1.';
}
这是我最近为一个基本网站制作的一些功能。它是基本的,不会查找邮政编码以查看是否存在,或检查邮政编码结构是否正确(字母:数字:字母等)。它只允许 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>';
如果您希望表单验证每个字段是否为“Ok”,您也可以将函数上的 return = false 更改为文本。只需检查所有字符串是否 == "Ok" 然后。
$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);
您只需在方括号中放置一个空格即可在可接受的字符中包含一个空格。所以它看起来像这样:
$add_check = '/^[a-zA-Z0-9- ]+$/';
那是你要找的吗?
请注意,我还在正则表达式中添加了“AZ”范围:您可能希望允许地址包含大写字母,除非您已经将地址减少为全部小写或其他内容。
我还建议在字符类中添加一个点,因为像“st”这样的缩写。和“大道”。可能会出现。然后它看起来像这样:
$add_check = '/^[a-zA-Z0-9-. ]+$/';
如果您将空格放在连字符之前,它应该可以工作:
$address1CheckPattern = '/[^A-Za-z0-9_ -]/';
在连字符之后,它将被解释为从下划线到空格的范围。
希望有帮助:)
在这方面有一些针对不同国家的正则表达式: 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');
它将文件的内容作为数组返回。接下来,您遍历列表(我会说您根据必须测试特定国家的邮政编码的机会对列表进行排序)并在 = - 字符之后执行表达式。
要验证邮政编码,您可以使用类似的方法,在这种情况下是西班牙邮政编码验证,但您可以在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
}