Extracting matches from php regex
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);
}
The simpler solution
- go to regex101.com
- Use the great documentation for creating and testing your regex (make sure you select PHP).
In the TOOLS section click on
code generation
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);
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.
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 )