现在用谷歌搜索了两天,在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);
答案 0 :(得分:1)
我只是这样做,因为使用点是一种可怕的做法。在正则表达式中你做错了什么的赠品是当你使用单行选项时。这是对资源的巨大浪费,并且必然会在某些时候破裂。
这是你需要使用的99.9%:
$street_address_regex = '~14px;">([^<]*)~i';
或者,如果您(由于某种原因)期望&lt;作为一个合法的字符,无论是小于还是格式化标签,如粗体或斜体,那么你可以这样做:
$street_address_regex = '~14px;">([^<]*<)*?\/span~i';
如果它让你感到困扰,你不想格式化你的字符串中的最后一个<
字符,你可以这样做:
$street_address_regex = '~14px;">((?:[^<]*(?(?!<\/span)<))*)~i';
但老实说,你甚至不应该使用正则表达式。找到<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);
}