Php 如何将变量搜索限制为一行文本?

Php 如何将变量搜索限制为一行文本?,php,regex,preg-match,Php,Regex,Preg Match,考虑到本示例文本: grupo1, tiago1A, bola1A, mola1A, tijolo1A, pedro1B, bola1B, mola1B, tijolo1B, raimundo1C, bola1C, mola1C, tijolo1C, joao1D, bola1D, mola1D, tijolo1D, felipe1E, bola1E, mola1E, tijolo1E, grupo2, tiago2A, bola2A, mola2A, tijolo2A, pedro2B, b

考虑到本示例文本:

grupo1, tiago1A, bola1A, mola1A, tijolo1A, pedro1B, bola1B, mola1B, tijolo1B, raimundo1C, bola1C, mola1C, tijolo1C, joao1D, bola1D, mola1D, tijolo1D, felipe1E, bola1E, mola1E, tijolo1E,

grupo2, tiago2A, bola2A, mola2A, tijolo2A, pedro2B, bola2B, mola2B, tijolo2B, raimundo2C, bola2C, mola2C, tijolo2C, joao2D, bola2D, mola2D, tijolo2D, felipe2E, bola2E, mola2E, tijolo2E,

grupo3, tiago3A, bola3A, mola3A, tijolo3A, pedro3B, bola3B, mola3B, tijolo3B, raimundo3C, bola3C, mola3C, tijolo3C, joao3D, bola3D, mola3D, tijolo3D, felipe3E, bola3E, mola3E, tijolo3E,

grupo4, tiago4A, bola4A, mola4A, tijolo4A, pedro4B, bola4B, mola4B, tijolo4B, raimundo4C, bola4C, mola4C, tijolo4C, joao4D, bola4D, mola4D, tijolo4D, felipe4E, bola4E, mola4E, tijolo4E,

grupo5, tiago5A, bola5A, mola5A, tijolo5A, pedro5B, bola5B, mola5B, tijolo5B, raimundo5C, bola5C, mola5C, tijolo5C, joao5D, bola5D, mola5D, tijolo5D, felipe5E, bola5E, mola5E, tijolo5E,
我想捕获
grupo3
后面的20个值,并将它们以4个为一组存储

我正在使用这个:()

但这只返回
grupo3
之后的前4个逗号分隔值

我需要生成这个数组结构:

Match 1 
Group 1 tiago3A 
Group 2 bola3A
Group 3 mola3A
Group 4 tijolo3A

Match 2 
Group 1 pedro3B
Group 2 bola3B
Group 3 mola3B
Group 4 tijolo3B

Match 3 
Group 1 raimundo3C
Group 2 bola3C
Group 3 mola3C
Group 4 tijolo3C

Match 4 
Group 1 joao3D
Group 2 bola3D
Group 3 mola3D
Group 4 tijolo3D

Match 5
Group 1 felipe3E
Group 2 bola3E
Group 3 mola3E
Group 4 tijolo3E

您可以尝试以下操作:

/、(.*?)、(.*?)、(.*?)、(.*?)、.*?$/m

末尾的
/m
表示
多行
的标志,前面的
$
表示
行结束

编辑:仅从第三段获取每4个元素

/grupo3,((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)),/

您可以在PHP中获得所需的输出,如:

preg_match('/grupo3,((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)), ((.*?),(.*?),(.*?),(.*?)),/', $str, $matches);

$groups = [];
unset($matches[0]);
$matches = array_values($matches);
$count = count($matches);
$j=0;
for($i=1;$i<$count;$i++)
{
    if($i%5 == 0)
    {
        $j++;
        continue;
    }
    $groups[$j][] = $matches[$i];

}

var_dump($groups);

请原谅我回答得太晚。这是一个完整的答案,有一个干净/直接的解决方案,如果这个页面没有暂停的话,我早就发布了。这是我在不知道如何生成/访问输入数据的情况下所能设计的最完善的解决方案

输入:

$text='grupo1, tiago1A, bola1A, mola1A, tijolo1A, pedro1B, bola1B, mola1B, tijolo1B, raimundo1C, bola1C, mola1C, tijolo1C, joao1D, bola1D, mola1D, tijolo1D, felipe1E, bola1E, mola1E, tijolo1E,

grupo2, tiago2A, bola2A, mola2A, tijolo2A, pedro2B, bola2B, mola2B, tijolo2B, raimundo2C, bola2C, mola2C, tijolo2C, joao2D, bola2D, mola2D, tijolo2D, felipe2E, bola2E, mola2E, tijolo2E,

grupo3, tiago3A, bola3A, mola3A, tijolo3A, pedro3B, bola3B, mola3B, tijolo3B, raimundo3C, bola3C, mola3C, tijolo3C, joao3D, bola3D, mola3D, tijolo3D, felipe3E, bola3E, mola3E, tijolo3E,

grupo4, tiago4A, bola4A, mola4A, tijolo4A, pedro4B, bola4B, mola4B, tijolo4B, raimundo4C, bola4C, mola4C, tijolo4C, joao4D, bola4D, mola4D, tijolo4D, felipe4E, bola4E, mola4E, tijolo4E,

grupo5, tiago5A, bola5A, mola5A, tijolo5A, pedro5B, bola5B, mola5B, tijolo5B, raimundo5C, bola5C, mola5C, tijolo5C, joao5D, bola5D, mola5D, tijolo5D, felipe5E, bola5E, mola5E, tijolo5E,';
方法:()

使用
preg_match()
提取单行,然后使用
explode()
拆分“逗号空间”上的字符串,然后使用
array_chunk()
存储在5个子数组中,每个子数组包含4个元素

模式的目标是
grupo3,
行的开头,然后使用
\K
重新启动完全匹配,然后贪婪地匹配每一个非换行符,并在行中最后一个逗号之前停止。正向前瞻
(?=,)
不会在完整字符串匹配中存储最后一个逗号

()

我的方法不保留任何前导空格和尾随空格,只保留值本身

输出:

array (
  0 => 
  array (
    0 => 'tiago3A',
    1 => 'bola3A',
    2 => 'mola3A',
    3 => 'tijolo3A',
  ),
  1 => 
  array (
    0 => 'pedro3B',
    1 => 'bola3B',
    2 => 'mola3B',
    3 => 'tijolo3B',
  ),
  2 => 
  array (
    0 => 'raimundo3C',
    1 => 'bola3C',
    2 => 'mola3C',
    3 => 'tijolo3C',
  ),
  3 => 
  array (
    0 => 'joao3D',
    1 => 'bola3D',
    2 => 'mola3D',
    3 => 'tijolo3D',
  ),
  4 => 
  array (
    0 => 'felipe3E',
    1 => 'bola3E',
    2 => 'mola3E',
    3 => 'tijolo3E',
  ),
)
p、 如果搜索词(
$needle
)是动态的,您可以使用类似的方法来获得相同的结果:()


为什么在问题的regexp中,
*
之前有空格,而在演示中没有空格?在正则表达式的开头放置
grupo3
的regex101上这样做有什么不对?@Makyen好的,我已经消除了这个问题的歧义。如果问题不再需要进一步编辑,我将通知回答者更新他们的工作。@Antonioioliveira您的输入数据已被编辑
tijolo-raimundo
在多行上更改为
tijolo,raimundo
。编辑认为这是一个错误,不是故意的。如果这是您输入数据的有意部分,请告诉我们是这样的情况,或者回答将数据返回到您实际需要的内容的问题。请参阅我发布的内容。我不想要每个段落的四个开头元素。我想把四个元素(限于第3段)分成5个子组。@mega6382。基本上是这样。但是如何告诉php括号中的第一个元素是第二个((?P.*?),(?P…)的同一组(?P…)?为了拯救这个页面,我不得不编辑OP的问题,以消除输入数据和期望结果的歧义。您可能需要更新答案以与新数据保持一致。(您的方法可以保持不变,只有值发生了更改。)。。。哦,我在输入中添加了一些缺少的逗号,因此如果您重新运行代码,您的输出数组将是完整的。@Antonioioliveira对不起,我不得不劫持您的问题内容以使其不被锁定。现在它已经打开了,我已经为您的问题提供了两个完善的解决方案。如果您对这些技术有任何疑问,请提问。
$text='grupo1, tiago1A, bola1A, mola1A, tijolo1A, pedro1B, bola1B, mola1B, tijolo1B, raimundo1C, bola1C, mola1C, tijolo1C, joao1D, bola1D, mola1D, tijolo1D, felipe1E, bola1E, mola1E, tijolo1E,

grupo2, tiago2A, bola2A, mola2A, tijolo2A, pedro2B, bola2B, mola2B, tijolo2B, raimundo2C, bola2C, mola2C, tijolo2C, joao2D, bola2D, mola2D, tijolo2D, felipe2E, bola2E, mola2E, tijolo2E,

grupo3, tiago3A, bola3A, mola3A, tijolo3A, pedro3B, bola3B, mola3B, tijolo3B, raimundo3C, bola3C, mola3C, tijolo3C, joao3D, bola3D, mola3D, tijolo3D, felipe3E, bola3E, mola3E, tijolo3E,

grupo4, tiago4A, bola4A, mola4A, tijolo4A, pedro4B, bola4B, mola4B, tijolo4B, raimundo4C, bola4C, mola4C, tijolo4C, joao4D, bola4D, mola4D, tijolo4D, felipe4E, bola4E, mola4E, tijolo4E,

grupo5, tiago5A, bola5A, mola5A, tijolo5A, pedro5B, bola5B, mola5B, tijolo5B, raimundo5C, bola5C, mola5C, tijolo5C, joao5D, bola5D, mola5D, tijolo5D, felipe5E, bola5E, mola5E, tijolo5E,';
var_export(preg_match('/^grupo3, \K.*(?=,)/m',$text,$out)?array_chunk(explode(', ',$out[0]),4):'fail');
array (
  0 => 
  array (
    0 => 'tiago3A',
    1 => 'bola3A',
    2 => 'mola3A',
    3 => 'tijolo3A',
  ),
  1 => 
  array (
    0 => 'pedro3B',
    1 => 'bola3B',
    2 => 'mola3B',
    3 => 'tijolo3B',
  ),
  2 => 
  array (
    0 => 'raimundo3C',
    1 => 'bola3C',
    2 => 'mola3C',
    3 => 'tijolo3C',
  ),
  3 => 
  array (
    0 => 'joao3D',
    1 => 'bola3D',
    2 => 'mola3D',
    3 => 'tijolo3D',
  ),
  4 => 
  array (
    0 => 'felipe3E',
    1 => 'bola3E',
    2 => 'mola3E',
    3 => 'tijolo3E',
  ),
)
$needle='grupo3';
// if the needle may include any regex-sensitive characters, use preg_quote($needle,'/') at $needle
var_export(preg_match('/^'.$needle.', \K.*(?=,)/m',$text,$out)?array_chunk(explode(', ',$out[0]),4):'fail');

/* or this is equivalent...
    if(preg_match('/^'.$needle.', \K.*(?=,)/m',$text,$out)){
        $singles=explode(', ',$out[0]);
        $groups=array_chunk($singles,4);
        var_export($groups);
    }else{
        echo 'fail';
    }
*/