我有一个HTML文件,其中包含产品信息,包括它们的重量。我正在尝试获取权重(lbs之前的任何数字)。有时,磅和权重数字之间会有空格。我想出了正则表达式:preg_match(">[0-9]+(\.[0-9][0-9]?)(.*?)lbs/i",fgets($file),$matches);,但它返回第一个'>‘和'lbs’之间的所有内容,这是不实用的,因为涉及到很多标签。所以我要做的是只获取紧跟在权重之前的字符'>‘和紧跟在权重之后的字符'lbs’之间的数字,而忽略了它们之间的空格。
所以在下面的例子中,我希望得到0.94,0.12,0.94。任何帮助都是非常感谢的。
<td width="513" valign="top">0.94 lbs
<td width="513" valign="top">0.12lbs
<td width="513" valign="top">0.94LBS
<td width="513" valign="top">penguin lover请注意,标记“<td width="513" valign="top">”位于除权重之外的其他字符之前。
任何想法,帮助都将不胜感激。
发布于 2013-11-23 01:27:20
使用:
/(?<=>)[0-9]+(?:\.[0-9][0-9]?)(?=\s*lbs)/i这使用了前视和后视,这样唯一匹配的就是十进制数。
说明:
(?<=>) look用于检查> -- (?<=xxx)表示向后查找xxx
使用非捕获组(?:xxx) [0-9]+(?:\.[0-9][0-9]?)您未更改的小数正则表达式
(?=\s*lbs)预视0-后跟lbs的多个空格字符
请注意,如果需要,您可以将每个[0-9]替换为\d,它们是等效的。
示例代码:
$str = '<td width="513" valign="top">0.94 lbs
<td width="513" valign="top">0.12lbs
<td width="513" valign="top">0.94LBS
<td width="513" valign="top">penguin lover';
preg_match_all("/(?<=>)[0-9]+(?:\.[0-9][0-9]?)(?=\s*lbs)/i",$str,$matches);
print_r($matches[0]);输出:
Array ( [0] => 0.94 [1] => 0.12 [2] => 0.94 )发布于 2013-11-23 01:40:00
preg_match_all('/[0-9]+(?:\.[0-9]+)(?=\s*lbs)/i', $html, $matches);
print_r($matches[0]);正则表达式:
[0-9]+ any character of: '0' to '9' (1 or more times)
(?: group, but do not capture (optional)
\. '.'
[0-9]+ any character of: '0' to '9' (1 or more times)
) end of grouping
(?= look ahead to see if there is:
\s* whitespace (\n, \r, \t, \f, and " ") (0 or more times)
lbs 'lbs'
) end of look-ahead请参阅working demo
https://stackoverflow.com/questions/20150730
复制相似问题