我很想知道是否有可能将子模式(子模式)包含到另一个模式中,从而使我可以将这2个preg_match和preg_match_all转换为一个preg_match / preg_match_all。

<?php

$data = 'office phones tel1 6665555998 tel2 555666888 tel3 555688855 home phones tel1 555222555 tel2 555222444 tel3 555666888';

preg_match('/phones(.*)home phones/', $data, $matches); // 1st operation
preg_match_all('/[0-9]{4,12}/',  $matches[1],  $matches); // 2nd operation

var_dump($matches);

// Question is: How to get same output with just only one preg_match

preg_match('/phones(SUBPATTERN)home phones/', $data, $result_data);

// Where SUBPATTERN is a pattern that would do exactly what 2nd operation did
// so $result_data contains what does $matches (array structure can be different can be 3 dimmensional array not only 2)

示例数据: https//eval.in/138817

注意:此问题是获取具有不同数据的答案的另一种方法: PHP正则表达式以数组形式返回子匹配

===============>>#1 票数:2

您可以将\\G锚用于全局研究(preg_match_all):

$pattern = '~(?:office phones|\G(?!\A)) tel\d+ \K\d{4,12}~';
preg_match_all($pattern, $data, $matches);

print_r($matches);

\\G是最后一次匹配后字符串中位置的锚点,当尚未匹配时(开始时),它等效于\\A锚点。

\\K用于从匹配结果中删除匹配的左侧部分。

===============>>#2 票数:0

使用正向前瞻(?=.*?home)

<?php

$data = 'office phones tel1 6665555998 tel2 555666888 tel3 555688855 home phones tel1 555222555 tel2 555222444 tel3 555666888';
preg_match_all('/([\d]{2,})(?=.*?home)/', $data, $matches, PREG_PATTERN_ORDER);
print_r($matches[1]);

Array
(
    [0] => 6665555998
    [1] => 555666888
    [2] => 555688855
)

?>

PHP
http://ideone.com/nryjIm

正则表达式
http://regex101.com/r/oV7mO2

这是根据您的评论进行的更新:

    $pnlist = "office phones tel1 6665555998 tel2 555666888 tel3 555688855 home phones tel1 555222555 tel2 555222444 tel3 555666888";

/*1*/    preg_match_all('/(?:office)(.*?)(?:home)/', $pnlist, $result, PREG_PATTERN_ORDER);
/*2*/    preg_match_all('/([\d]{2,})/', $result[1][0], $pn, PREG_PATTERN_ORDER);

    print_r($pn[1]);

/*
Array ( 
 [0] => 6665555998
 [1] => 555666888
 [2] => 555688855
 ) 
*/

您可以将第一个preg_match_all start( office )和end( home )值更改为所需的值,然后匹配该组上的电话号码。

===============>>#3 票数:-1

$data = 'office phones tel1 6665555998 tel2 555666888 tel3 555688855 home phones tel1 555222555 tel2 555222444 tel3 555666888';


preg_match_all('/[0-9]{4,12}/', $data,  $matches); // 2nd operation

var_dump($matches);

像这个例子

  ask by Grzegorz translate from so

未解决问题?本站智能推荐:

1回复

正则表达式PHP子模式

我无法使用子模式 我想从具有超过3个字符的title属性中提取所有单词。 如果我尝试以下表达式,它们都可以工作。 但是,只要我想将最后一个作为子模式,它就不会在数组中输出2条空记录。 我正在使用以下文本$ input_lines
1回复

在php中使用正则表达式进行排列

有没有办法在php中使用正则表达式来获取字符串中所有单词的排列。 例如: 输入如“如何消除人体膝盖疼痛” 我希望输出为: “如何”,“如何”,“疼痛膝盖”,“去除膝盖”,“膝盖疼痛”,“移除”,“人类疼痛膝盖”等
1回复

如何在PHP中使用正则表达式找到完全匹配?

尝试使用PHP中的正则表达式模式与我的URL匹配时遇到一些问题。 我的正则表达式: /article/([0-9A-Za-z]++)/post/([0-9A-Za-z-_]++) 示例1: VALID MATCH(好) 但也匹配这个 (坏): 我只想匹配第一个
2回复

PHP如何将模式转换为正则表达式?

如何使模式成为正则表达式? 例如,我将this :id作为我的网址格式之一,我想将其变成一个正则表达式,以便它可以匹配1或2或3 。 因此$match应该为true 。 我有这个, 但结果是int 0 。
1回复

在PHP中使用正则表达式将圆括号嵌套到数组[重复]

这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 正则表达式匹配外括号 我有以下格式的字符串: ((((aaa(bbb)ccc)(ddd(eee)
2回复

使用正则表达式捕获不同的语法

我将代码嵌入到HTML中,它将看起来像这样: 我试图编写一个正则表达式,将这些HTMLObjects分解成可管理的数组。 我已经有正则表达式,可以执行以下操作 但是,我在使正则表达式也匹配类似的问题上遇到了麻烦 这是我执行这些任务的功能: 当我像在页面开头演示的
2回复

PHP - 正则表达式 - 匹配正则表达式而不包括多次相同的正则表达式

使用PHP ,我有以下代码: 然后我想catch以下几groups : 我尝试了以下方法: 但我得到: 但这不是我想要的,因为它们在一起。 我也尝试过: 但我得到: 这不是我想要的。 知道用什么regexp来获得above提到的grou
3回复

无法匹配正则表达式

我有一个类似"5-2,5-12,15-27,5-22,50-3,5-100"的字符串 我需要一个匹配所有出现的正则表达式,如下所示:- 什么是匹配所有这些的正确正则表达式。
1回复

在特定情况下的正则表达式PHP正则表达式问题

有一点问题。 我正在尝试使用preg_match_all,但有些情况下正则表达式不起作用。 上面的代码在变量$ html中 这将返回3838942897078。这是正确的,但是针对不同情况的相同代码给出了$ extract的var_dump空数组。 这确实意味着我没有找到任何
1回复

在PHP中更正非法的PCRE正则表达式

更新5/26 我已经修复了此问题之前包含的正则表达式的行为,但正如其他人所提到的,我的语法仍然不正确。 显然它编译的事实是由于PHP的preg_*系列函数忽略了我的错误。 我绝对是一名PCRE新手,所以我试图了解哪些错误存在,以便我可以去解决它们。 我也对设计/方法的批评持开放态