Php preg_match正则表达式有点不对劲

Php preg_match正则表达式有点不对劲,php,regex,preg-match,Php,Regex,Preg Match,我是正则表达式的初学者,所以没过多久我就完全迷路了:] 我需要做的是: 我得到了一个值字符串'a:b,a2:b2,a3:b3,a4:b4',其中我需要通过给定值对的第二个值(b2)搜索一对特定的值(即:a2:b2),并将该值对的第一个值作为输出(a2) 允许使用所有字符(分隔每对值的“,”除外),并且任何第二个值(b、b2、b3、b4)都是唯一的(不能在字符串中出现多次) 让我举一个更好的例子,因为前面的例子可能不清楚: 这是一个字符串:2分钟:2,5分钟:5,10分钟:10,15分钟:15,从

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

我需要做的是:

我得到了一个值字符串'a:b,a2:b2,a3:b3,a4:b4',其中我需要通过给定值对的第二个值(b2)搜索一对特定的值(即:a2:b2),并将该值对的第一个值作为输出(a2)

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

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

这是一个字符串:2分钟:2,5分钟:5,10分钟:10,15分钟:15,从不: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'];
$str='2分钟:2,5分钟:5,10分钟:10,15分钟:15,20分钟:20,30分钟:30,从不:0';
$re='/(?P\w+):5$/';
预匹配($re,$str,$matches);
echo$matches['name'];
想要的输出为“5分钟”,但不起作用

我还想坚持使用Perl兼容的reg。上面代码中的表达式包含在PHP脚本中

有人能帮我吗?我现在有点绝望了,因为我花了一天的时间在这上面

谢谢大家。

$re='/(?:^ |,)(?p[^:]*):5(?:,|$)/;
$re = '/(?:^|,)(?P<name>[^:]*):5(?:,|$)/';
除了表达式必须在5之后匹配
$
的问题(仅当5是最后一个元素时才有效)之外,您还需要确保
5
之后没有出现任何内容或出现另一对内容;在该对的第一个元素之前是另一个元素或字符串的开头,并且您希望匹配该对的第一个元素中多于
\w

$re='/(?:^ |,)(?p[^::*):5(?:,|$)/;

除了表达式必须在5之后匹配
$
的问题(仅当5是最后一个元素时才有效)之外,您还需要确保
5
之后没有出现任何内容或出现另一对内容;在对的第一个元素之前是另一个元素或字符串的开头,并且您希望匹配对的第一个元素中多于
\w

一个
preg\u 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);

一个
preg\u 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);

几乎和迈克尔的一样。它不搜索元素,而是构造一个字符串数组。您说值是唯一的,因此它们在我的数组中用作键:

echo $a[5];
然后访问元素非常简单:


几乎和迈克尔的一样。它不搜索元素,而是构造一个字符串数组。您说值是唯一的,因此它们在我的数组中用作键:

echo $a[5];
然后访问元素非常简单:


这是我的第一个工作解决方案(使用字符串函数+foreach),但我认为preg_match会更快、更短。这是我的第一个工作解决方案(使用字符串函数+foreach),但我认为preg_match会更快、更短。
$search
通常会被转义(请参见前报价);另外,如果有另一对以5开头的第二个元素出现在该对之前,则您的表达式将失败
5分钟:5
-12Artefactor:不幸的是,这是真的。关于如何解决此问题的任何建议?非常合理的注释。已更新。似乎它解决了提到的问题。
$search
通常都会被忽略ed(请参见
preg_quote
);另外,如果有另一对以5开头的第二个元素出现在该对之前,则表达式将失败
5分钟:5
-12Artefactor:不幸的是,这是真的。关于如何解决此问题的任何建议?非常合理的注释。已更新。似乎它解决了提到的问题。
echo $a[5];