Extracting matches from php regex

34,877

Solution 1

Try using the named subpattern syntax of 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);

?>

Output:

 Array (
     [0] => foobar: 2008
     [name] => foobar
     [1] => foobar
     [digit] => 2008
     [2] => 2008 )

Solution 2

Check the php manual

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches1 will have the text that matched the first captured parenthesized subpattern, and so on.

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

Solution 3

You can just modify your current regexp to capture everything after the colon up to the first space:

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

In case you're not familiar with regexp, [^ ]+ means "any character but a space" and it doesn't require a space to be present to work. If for any reason the input changes to "E:[email protected]" without the " I:12345" bit, it will still work.

Solution 4

The simpler solution

  1. go to regex101.com
  2. Use the great documentation for creating and testing your regex (make sure you select PHP).
  3. In the TOOLS section click on code generation

  4. This is an example of what I got.

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

Solution 5

Use the matchs parameter of the preg_match function as follows:

matches:
If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

Share:
34,877
Natkeeran
Author by

Natkeeran

A programmer. Skill Set: Java (Servlets, JSP, Tomcat, Eclipse), PHP, Perl, C/C++ Javasript (jQuery, ExtJs), HTML, CSS SQL, MySQL, PostgreSQL, Oracle XML, XSLT/XPath, DOM LAMP, Windows MATLAB, COMSOL Education: Engineering

Updated on May 09, 2020

Comments

  • Natkeeran
    Natkeeran about 4 years

    In perl regex we can extract the matched variables, ex below.

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

    How to do this in php?

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

    How to extract the email from there? (We can explode it and get it...but would like a method to get it directly through regex)?