preg_match邮政编码&国家不工作

时间:2015-04-26 14:15:39

标签: php preg-match

不确定为什么下面没有找到拉链和状态?

$str = 'contact_widget_statezip">NM  87035 ';
$pattern = '[A-Z]{2}\W{1,10}[0-9]{5}';
preg_match_all($pattern, $str, $amatches);

由于 格伦

2 个答案:

答案 0 :(得分:1)

尝试一下,

<?php
$str = 'contact_widget_statezip">NM&nbsp; 87035 ';
$pattern = '~([A-Z]{2})\s*([0-9]){5}~';
preg_match_all($pattern, html_entity_decode($str), $amatches);
print_r($amatches);

输出:

Array
(
    [0] => Array
        (
            [0] => NM? 87035
        )

    [1] => Array
        (
            [0] => NM
        )

    [2] => Array
        (
            [0] => 87035
        )

)

这会使您的字符串NM&nbsp; 87035并将其转换为NM 87035,因为&nbsp; = 。然后它搜索两个大写字母,任意数量的空格,然后搜索5个数字。如果您需要空格,请将*更改为+ ..

...更新

\W{1,10}在您的示例中不起作用,因为\W\w的反转,它是任何单词字符。 &符,分号和空格属于该组,但nbsp没有。如果你不想解码实体而只是忽略你可以使用[A-Z]{2}[[a-zA-Z0-9; &]{1,10}[0-9]{5}的空白,那么对于PHP来说它就是......

<?php
$str = 'contact_widget_statezip">NM&nbsp; 87035 ';
$pattern = '~([A-Z]{2})[a-zA-Z0-9; &]{1,10}([0-9]{5})~';
preg_match_all($pattern, $str, $amatches);
print_r($amatches);

答案 1 :(得分:0)

谢谢Chris,
您的意见有助于解决此问题 下面找到一个邮政编码和状态,并在没有html_entity_decode的情况下忽略它们之间的垃圾。

$str = 'contact_widget_statezip">NM&nbsp; 87035 ';
$pattern = "\b[A-Z]{2}\b.{1,10}\b[0-9]{5}\b/s";