3

已经用谷歌搜索了两天,这里有很多关于 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);
4

1 回答 1

1

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

这是您需要使用的 99.9%:

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

或者,如果您(出于某种原因)期望 < 作为合法字符,或者表示小于或格式化标签(如粗体或斜体),那么您可以这样做:

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

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

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

.

用这个测试仪测试它

.

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

听起来很多,但是把它变成一个你使用的小函数而不是 Regex,只需输入 OriginalString、StartString 和 EndString……然后使用我刚才说的方法返回 StartString 和 EndString 之间的内容。使函数可重用。

使用该功能,您的那部分代码至少会快 10 倍正则表达式对于模式来说非常强大,但是你没有模式,你有两个静态字符串,你想要它们之间的内容。正则表达式对于静态字符串操作非常慢......尤其是使用单线点〜颤抖

$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);
}
于 2013-10-30T07:15:28.043 回答