Извлечение совпадений из регулярного выражения php


В регулярном выражении perl мы можем извлечь соответствующие переменные, например, ниже.

   # extract hours, minutes, seconds
   $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
   $hours = $1;
   $minutes = $2;
   $seconds = $3;

Как это сделать в php?

$subject = "E:[email protected] I:100955";
$pattern = "/^E:/";
if (preg_match($pattern, $subject)) {
    echo "Yes, A Match";
}

Как извлечь оттуда электронное письмо? (Мы можем взорвать его и получить его... но хотели бы, чтобы метод получил его непосредственно через регулярное выражение)?

Author: Natkeeran, 2009-09-29

4 answers

Попробуйте использовать синтаксис именованного подшаблона preg_match:

<?php

$str = 'foobar: 2008';

// Works in PHP 5.2.2 and later.
preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

// Before PHP 5.2.2, use this:
// preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

print_r($matches);

?>

Вывод:

 Array (
     [0] => foobar: 2008
     [name] => foobar
     [1] => foobar
     [digit] => 2008
     [2] => 2008 )
 19
Author: Chris Rasco, 2009-09-29 14:49:42

Проверьте руководство по php

Intpreg_match (строка $шаблон, строка $тема [, массив и $совпадения [, int $флаги [, int $смещение]]])

Если указано совпадение, то оно заполняется результатами поиска. $matches[0] будет содержать текст, соответствующий полному шаблону, $matches1 будет иметь текст, соответствующий первому захваченному подшаблону в скобках, и так далее.

$subject = "E:[email protected] I:100955";
$pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/";
if (preg_match($pattern, $subject,$matches)) {
    print_r($matches);
}
 8
Author: Yannick Motton, 2009-09-29 14:52:48

Вы можете просто изменить текущее регулярное выражение, чтобы захватить все после двоеточия до первого пробела:

$subject = "E:[email protected] I:100955";
$pattern = "/^E:([^ ]+)/";
if (preg_match($pattern, $subject, $m)) {
    echo "Yes, A Match";
}
$email = $m[1];

В случае, если вы не знакомы с регулярным выражением, [^ ]+ означает "любой символ, кроме пробела", и для его работы не требуется наличие пробела. Если по какой-либо причине входные данные изменятся на "E:[email protected] " без бита "I:12345" он все равно будет работать.

 3
Author: Josh Davis, 2009-09-29 14:53:22

Используйте параметр matches функции preg_match следующим образом:

Совпадения:
Если совпадения указаны, то он заполняется результатами поиска. $matches[0] будет содержать текст, соответствующий полному шаблону, $matches[1] будет содержать текст, соответствующий первому захваченному подшаблону в скобках, и так далее.

 1
Author: ennuikiller, 2009-09-29 14:46:30