Подтвердить что ты не робот

Извлечение совпадений из php regex

В perl regex мы можем извлечь согласованные переменные, ex ниже.

   # 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";
}

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

4b9b3361

Ответ 1

Попробуйте использовать синтаксис именованного подшаблона 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 )

Ответ 2

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

int preg_match (строка $pattern, строка $subject [, array & $matches [, int $flags [, int $offset]]])

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

$subject = "E:[email protected] I:100955";
$pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/";
if (preg_match($pattern, $subject,$matches)) {
    print_r($matches);
}

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Более простое решение

  1. перейти на regex101.com
  2. Используйте отличную документацию для создания и тестирования вашего регулярного выражения (убедитесь, что вы выбрали PHP).
  3. В разделе ИНСТРУМЕНТЫ нажмите на code generation

  4. Это пример того, что я получил.

$re = '/\#.*@hello\((?<operator>\w+),?(?<args>.*)\).*/m';
$str = ' Testing string
# @hello(group_fields)
# @hello(operator, arguments, more arguments)';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);