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