【问题标题】:A bit lost with preg_match regular expressionpreg_match 正则表达式有点丢失
【发布时间】:2011-11-19 19:24:51
【问题描述】:

我是正则表达式的初学者,所以没过多久我就完全迷失了:]

我需要做什么:

我有一串值 'a:b,a2:b2,a3:b3,a4:b4' 我需要通过第二个值搜索特定的一对值(即:a2:b2)给定的对 (b2) 并获得该对的第一个值作为输出 (a2)。

允许使用所有字符(除了分隔每对值的“,”),并且第二个值(b、b2、b3、b4)中的任何一个都是唯一的(在字符串中不能出现多次)

让我举一个更好的例子,因为前面可能不太清楚:

这是一个字符串:2分钟:2,5分钟:5,10分钟:10,15分钟:15,never:0

搜索到的模式是:5

我认为,最好的方法是使用名为 preg_match 的函数和子模式功能。

所以我尝试了以下方法:

$str = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0';

$re = '/(?P<name>\w+):5$/';
preg_match($re, $str, $matches);

echo $matches['name'];

想要的输出是“5 分钟”,但没有用。

我也想坚持使用 Perl-Compatible reg。上述代码中的表达式包含在 PHP 脚本中。

谁能帮帮我?我现在有点绝望了,因为我现在大部分时间都在这上面度过......

谢谢大家。

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:
    $str = '2 minutes:2,51 seconds:51,5 minutes:5,10 minutes:10,15 minutes:51,never:0';
    $search = 5;
    
    preg_match("~([^,\:]+?)\:".preg_quote($search)."(?:,|$)~", $str, $m);
    
    echo '<pre>'; print_r($m); echo '</pre>';
    

    输出:

    Array
    (
        [0] => 5 minutes:5
        [1] => 5 minutes
    )
    

    【讨论】:

    • $search 通常会被转义(参见preg_quote);另外,如果有另一对以 5 开头的第二个元素出现在 5 minutes:5 之前,那么您的表达式将失败。 -1
    • 2Artefacto:不幸的是真的。有关如何解决此问题的任何建议?
    • 很合理的笔记。更新。似乎它解决了提到的问题。
    【解决方案2】:
    $re = '/(?:^|,)(?P<name>[^:]*):5(?:,|$)/';
    

    除了你的表达式必须在 5 之后匹配 $ 的问题(这只有在 5 是最后一个元素时才有效)之外,你还想确保在 5 之后要么什么都没有出现,要么另一对出现;在该对的第一个元素之前是另一个元素或字符串的开头,并且您希望在该对的第一个元素中匹配多个\w

    【讨论】:

      【解决方案3】:

      preg_match 调用肯定会更短,但我想我不会使用正则表达式,而只需使用字符串和数组操作。

      $pairstring = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0';
      
      function match_pair($searchval, $pairstring) {
        $pairs = explode(",", $str);
        foreach ($pairs as $pair) {
          $each = explode(":", $pair);
          if ($each[1] == $searchval) {
            echo $each[0];
          }
        }
      }
      
      // Call as:
      match_pair(5, $pairstring);
      

      【讨论】:

      • 这是我第一个可行的解决方案(使用字符串函数 + foreach),但我认为 preg_match 会更快更短。
      【解决方案4】:

      几乎和@Michael的一样。它不搜索元素,而是构造字符串的数组。你说值是唯一的,所以它们被用作我数组中的键:

      $str = '2 minutes:2,5 minutes:5,10 minutes:10,15 minutes:15,20 minutes:20,30 minutes:30, never:0';
      $a = array();
      foreach(explode(',', $str) as $elem){
          list($key, $val) = explode(':', $elem);
          $a[$val] = $key;
      }
      

      那么访问一个元素就很简单了:

      echo $a[5];
      

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        相关资源
        最近更新 更多