php REGEX,尝试从一行中提取两个值(一个可选)

时间:2011-03-01 21:05:10

标签: php regex preg-match expression preg-match-all

我有一个包含许多行的字符串,其中一行是温度读数,用于获取温度的方法如下:

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: *(.+)(?: - )?(.+)?/";

对不起,我想我需要添加更多细节:

  • 我不知道temp会显示什么样的格式(35.20c / 95.36f,35c,95.3f等)
  • 我基本上只需要在“temp:”之后和连字符之前取一切作为我的临时工具,之后的一切都将成为我的方法。

6 个答案:

答案 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)?(。)/”;