我有一个包含许多行的字符串,其中一行是温度读数,用于获取温度的方法如下:
Example line 1
temp: 35.20c / 95.36f - axillary
Example line 2
显然,温度是“35.20c / 95.36f”,并且该方法是“腋窝”。方法部分是可选的。我在写一个将提取两者的REGEX模式时遇到问题,因为该方法可以是可选的。
因此,如果我在以下字符串的preg_match_all()中运行模式:
temp: 35.20c / 95.36f - axillary
temp: 35.20c / 95.36f
temp: 35.20c / 95.36f - oral
我希望得到类似的印刷品:
Array
(
[0] => Array
(
[0] => temp: 35.20c / 95.36f - axillary
[1] => temp: 35.20c / 95.36f
[2] => temp: 35.20c / 95.36f - oral
)
[1] => Array
(
[0] => 35.20c / 95.36f
[1] => 35.20c / 95.36f
[2] => 35.20c / 95.36f
)
[2] => Array
(
[0] => axillary
[1] =>
[2] => oral
)
我尝试了很多不同的模式,所以我只会发布我的原文(这对我来说很有意义):
$ptn = "/temp: *(.+)(?: - )?(.+)?/";
对不起,我想我需要添加更多细节:
答案 0 :(得分:1)
试试这个:
<?php
$lines = "temp: 35.20c / 95.36f - axillary
temp: 35.20c / 95.36f
temp: 35.20c / 95.36f - oral";
preg_match_all("/^temp:\s+([^-\n]+)( - )?(.*)/m", $lines, $matches);
print_r($matches);
?>
答案 1 :(得分:1)
啊我认为你的问题是(。+)匹配所有内容。正则表达式模式是&#34;贪婪&#34;并尽可能多地尝试和匹配。该模式与字符串的其余部分匹配,不为其他组留下任何内容。
答案 2 :(得分:1)
所以它看起来像你想要的那样:
/^temp: (\d+\.\d+)c \/ (\d+\.\d+)f(?: - ([^$]+))?$/
摄氏温度为1美元,华氏温度为2美元,方法为3美元。 ([^$]+)
可能不正确取决于你想做什么,因为它会捕获到行尾的所有内容(如空格,如果有的话)。您可以在最后使用(?: - ([^$]+?))?\s*$/
,我认为这样可以解决这个问题。
温度是否始终为十进制格式?他们可能只是“0c / 32f”吗?
修改:刚看到您的更新。看起来贪婪的.+
确实是问题的一部分,正如Rob Agar所说的那样。你可以试试这个:
/^temp:\s*(\d+(?:\.\d+)?)c\s*\/\s*(\d+(?:\.\d+)?)f(?:\s*-\s*([^$]+?))?\s*$/
即使该方法不止一个单词,这也应该有效。不确定这是否可能,我正在根据您的要求做出最佳猜测。
答案 3 :(得分:0)
基本上你需要'?'在捕获组之后的方法。这表明该组可能不存在,但整体模式仍应匹配。你的模式目前是什么样的?
答案 4 :(得分:0)
我可能会在这里做一些假设,但您可以尝试以下
/^temp: ((\d+\.\d+c) / (\d+\.\d+f))( - (\w+))?$/
由于所有子分组,你的匹配数组将包含比你的例子更多的项目,但你所追求的那个应该在那里
答案 5 :(得分:0)
$ ptn =“/ temp:(。)(\ s- \ s)?(。)/”;