从PHP正则表达式中提取匹配项

27

在 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:contact@customer.com I:100955";
$pattern = "/^E:/";
if (preg_match($pattern, $subject)) {
    echo "Yes, A Match";
}

如何提取电子邮件地址?(我们可以使用explode进行拆分并获取电子邮件地址...但是想通过正则表达式直接获取它)?

6个回答

40

可以尝试使用 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 )

11

查阅php手册

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

如果提供了 matches 参数,则它会被填充搜索的结果。 $matches[0] 将包含与完整模式匹配的文本, $matches1将包含与第一个括号捕获子模式匹配的文本, 以此类推。

$subject = "E:contact@customer.com I:100955";
$pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/";
if (preg_match($pattern, $subject,$matches)) {
    print_r($matches);
}

4

更简单的解决方法

  1. 访问regex101.com
  2. 使用丰富的文档创建和测试您的正则表达式(确保选择PHP)。
  3. TOOLS部分,点击代码生成

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

3
你可以修改你当前的正则表达式,捕获冒号后面到第一个空格之间的所有内容:
$subject = "E:contact@customer.com I:100955";
$pattern = "/^E:([^ ]+)/";
if (preg_match($pattern, $subject, $m)) {
    echo "Yes, A Match";
}
$email = $m[1];

如果您不熟悉正则表达式,[^ ]+ 表示 "除了空格之外的任何字符",并且它不需要存在空格即可工作。如果由于某种原因输入更改为没有 " I:12345" 部分的 "E:email@host.tld",它仍然可以工作。


3

使用preg_match函数的matches参数如下:

matches:
如果提供了matches参数,则会用搜索结果填充它。$matches[0]将包含与完整模式匹配的文本,$matches[1]将包含与第一个捕获的括号子模式匹配的文本,依此类推。


0

没有直接的函数可以找到!但是你可以像这样拥有自己的函数

function preg_find($pattern, $text, $def = null){
    $matches = PREG_FindAll($pattern, $text);
    return isset($matches[0])?$matches[0]:$def;
}

function preg_findall($pattern, $text){
    preg_match($pattern, $text, $matches);
    return $matches;
}

享受...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接