Немного потеряно с регулярным выражением preg_match - PullRequest
2 голосов
/ 18 сентября 2011

Я новичок в регулярных выражениях, поэтому мне не понадобилось много времени, чтобы полностью потеряться:]

Что мне нужно сделать:

У меня есть строка значений '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 с функцией subpattern.

Итак, я попробовал следующее:

$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-совместимых рег. выражения в виде кода выше включены в скрипт PHP.

Кто-нибудь может мне помочь? Теперь я немного отчаялся, потому что я провел большую часть дня в этом ...

Спасибо всем вам, ребята.

Ответы [ 4 ]

0 голосов
/ 18 сентября 2011

Почти так же, как @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];
0 голосов
/ 18 сентября 2011

A 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);
0 голосов
/ 18 сентября 2011
<code>$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 '
';

Выход:

Array
(
    [0] => 5 minutes:5
    [1] => 5 minutes
)
0 голосов
/ 18 сентября 2011
$re = '/(?:^|,)(?P<name>[^:]*):5(?:,|$)/';

Помимо проблемы, связанной с тем, что ваше выражение должно соответствовать $ после 5, что сработало бы, только если 5 был последним элементом, вы также хотите убедиться, что после 5 либо ничего не приходит, либо приходит другая пара;что перед первым элементом пары идет либо другой элемент, либо начало строки, и вы хотите сопоставить более чем \w в первом элементе пары.

...