使用preg_match正则表达式有点丢失

时间:2011-09-18 19:42:41

标签: php regex preg-match

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

我需要做什么:

我有一串值'a:b,a2:b2,a3:b3,a4:b4'我需要按第二个值搜索一对特定的值(即:a2:b2)给出(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'];

通缉输出是'5分钟',但它不起作用。

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

任何人都可以帮助我吗?我现在变得有点绝望了,因为我现在大部分时间都花在了这一天......

感谢你们所有人。

4 个答案:

答案 0 :(得分:0)

$re = '/(?:^|,)(?P<name>[^:]*):5(?:,|$)/';

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

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

$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
)

答案 3 :(得分:0)

@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];