2012-03-23 34 views
1

这里很基本的东西,试图拉数14.5使用正则表达式和PHP,但我似乎无法得到语法正确。此外,数量是动态的,不能永远是一个小数,但这里的目标是尽量抠字眼Weight:</li>之间的数字:PHP和preg_match正则表达式以字符串拉小数十进制

<ul> 
    <li>Manufacturer: something</li> 
    <li>Model: 1216D101</li> 
    <li>Condition: New</li> 
    <li>Dimensions: 12" x 16"</li> 
    <li>Sold by the Dozen</li> 
    <li>Weight: 14.5 Lbs.</li> 
    </ul> 

这是我迄今为止,并试图改变,但是不断下跌的短:

if (preg_match("/\Weight:\(\d+)\.(\d*?)\<\/li>/", $desc, $WEIGHT) == true) 
    { echo $WEIGHT[0]; } 

回答

1

试试这个正则表达式:

/Weight: ((?:\d+)(?:\.\d*)?)/ 

匹配的数量将在$WEIGHT[1]可用。

如果你不希望捕捉号码.123.:如果你只是

if (preg_match('/Weight: (\d+(\.\d+)?)/', $desc, $matches)) { 
    echo $matches[1]; 
} 
+0

这会匹配它不应该的东西(例如, '123.'),并且不符合它的要求(例如'123')。 – FtDRbwLXw6 2012-03-23 14:04:36

+0

有趣。这似乎有诀窍,但drrcknlsn可能会做些什么。我不确定我是否会在没有进一步测试的情况下遇到这个问题,但到目前为止它仍然有效。 – ToddN 2012-03-23 14:08:17

+0

'123.'是一个有效的数字。这个正则表达式匹配'123'。 – 2012-03-23 14:08:51

3

试试这个想匹配一个数字整数或小数点

if (preg_match('/^(\d+(\.\d+)?)$/',$num)) echo "$num is integer or decimal"; 
0
preg_match('<li>Weight: (\d+)\.?(\d+)?.+</li>', // ... 

应招

+0

这要求数字有一个小数点和小数点。 OP说数字“不一定总是小数。” – FtDRbwLXw6 2012-03-23 14:06:39

+0

哦,是的,我忘了添加'?',谢谢 – 2012-03-23 14:09:01

0

/Weight: ((?:\d+)(?:\.\d+)?)/