繁体   English   中英

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

[英]Extracting matches from php regex

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

如何从那里提取 email? (我们可以分解并获取它……但是想要一种直接通过正则表达式获取它的方法)?

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

检查php手册

int preg_match ( string $pattern , string $subject [, array &$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);
}

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

$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” ,它仍然可以工作。

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

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

更简单的解决方案

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

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

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

享受...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM