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

时间:2009-09-29 14:40:32

标签: php regex perl

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

如何从那里提取电子邮件? (我们可以将它爆炸并获得它......但是想要一种直接通过正则表达式获取它的方法)?

5 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:9)

检查php manual

  

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

     

如果提供了匹配,那么它将填充搜索结果。   $ matches [0]将包含该文本   匹配完整模式,$ matches 1   将有与之匹配的文本   首先捕获括号   子模式,等等。

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

答案 2 :(得分:3)

您可以修改当前的正则表达式,以捕获冒号到第一个空格后的所有内容:

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

如果您不熟悉正则表达式,[^ ]+表示“任何字符,只有空格”,并且它不需要空间来工作。如果由于任何原因输入更改为“E:email@host.tld”而没有“I:12345”位,它仍然有效。

答案 3 :(得分:2)

使用preg_match函数的matchs参数,如下所示:

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

答案 4 :(得分:0)

更简单的解决方案

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