正则表达式PHP代码刮去有换行符的街道地址

时间:2013-10-27 17:20:43

标签: php regex

现在用谷歌搜索了两天,在SOF上搜索了很多,但我无法解决这个正则表达式的preg_match问题。我想简单地刮一个街道地址,通常我可以很容易地做到这一点,但是因为一些街道地址在它们中间有大约25个字符的空格,我的代码显示一个空数组或只是NULL。

下面我已经包含了源代码,以显示我正在尝试抓取的示例,以及我到目前为止失败的代码。在星期天早上,我会非常感谢有经验的人提供的帮助。

这里的源代码示例;

<span style="font-size:14px;">736 
                  E 17th St</span><br />

到目前为止我的尝试;

$new_data = file_get_contents('someURLaddress');

$street_address_regex = '~14px\;\"\>(.*?)\<\/span\>\<br\s\/\>\s~s';

preg_match($street_address_regex,$new_data,$extracted_street_address);

var_dump ($extracted_street_address);

1 个答案:

答案 0 :(得分:1)

我只是这样做,因为使用点是一种可怕的做法。在正则表达式中你做错了什么的赠品是当你使用单行选项时。这是对资源的巨大浪费,并且必然会在某些时候破裂。

这是你需要使用的99.9%:

$street_address_regex = '~14px;">([^<]*)~i';

或者,如果您(由于某种原因)期望&lt;作为一个合法的字符,无论是小于还是格式化标签,如粗体或斜体,那么你可以这样做:

$street_address_regex = '~14px;">([^<]*<)*?\/span~i';

如果它让你感到困扰,你不想格式化你的字符串中的最后一个<字符,你可以这样做:

$street_address_regex = '~14px;">((?:[^<]*(?(?!<\/span)<))*)~i';

测试With This Tester

但老实说,你甚至不应该使用正则表达式。找到<span style="font-size:14px;"> stripos 并添加其长度(以获取地址起点)...然后找到</span> stripos 并输入先前找到的索引的偏移点(获取地址结束点)。减去它们以获得长度。然后使用OriginalString,StartIndex和And Length拉 substr

听起来很多,但是使用一个小函数而不是Regex,只需输入OriginalString,StartString和EndString ......然后使用我刚刚说过的方法返回StartString和EndString之间的内容。使功能可重复使用。

使用该功能,您的代码部分字面运行速度至少快10倍。正则表达式对于模式很有用,但是你没有模式,你有两个静态字符串,你想要它们之间的内容。对于静态字符串操作,正则表达式很慢...特别是使用单线点〜 Shiver

$Input = '<span style="font-size:14px;">736 E 17th St</span><br />';
echo GetBetween($Input, '14px;">', '</span');

function GetBetween($OrigStr, $StartStr, $EndStr) {
    $StartPos = stripos($OrigStr, $StartStr) + strlen($StartStr);
    $EndPos = stripos($OrigStr, $EndStr, $StartPos);
    return substr($OrigStr, $StartPos, $EndPos - $StartPos);
}