我是正则表达的初学者,所以我没多久就完全迷失了:]
我需要做什么:
我有一串值'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脚本中。
任何人都可以帮助我吗?我现在变得有点绝望了,因为我现在大部分时间都花在了这一天......
感谢你们所有人。
答案 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];