php regex从字符串中提取多个匹配项

sad*_*ave 7 php regex file

我正在尝试制作一个php正则表达式从一个字符串中提取多个部分/条件...让我告诉你我在说什么; 这是总文件内容的摘录(真实内容包含数百个这样的分组):

part "C28"
{ type       : "1AB010050093",
  %cadtype   : "1AB010050094",
  shapeid    : "2_1206",
  descr      : "4700.0000 pFarad 10.00 % 100.0 - VE5-VS3",
  insclass   : "CP6A,CP6B",
  gentype    : "RECT_032_016_006",
  machine    : "SMT",
  %package   : "080450E",
  %_item_number: "508",
  %_Term_Seq : "" }
part "C29"
{ type       : "1AB008140029",
  shapeid    : "2_1206",
  descr      : "150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR",
  insclass   : "CP6A,CP6B",
  gentype    : "RECT_032_016_006",
  machine    : "SMT",
  %package   : "080450E",
  %_item_number: "3",
  %_Term_Seq : "" }
Run Code Online (Sandbox Code Playgroud)

如您所见,摘录中的数据重复两次.我需要搜索整个文件并提取以下内容:

  • 单词"part"后面的字符串 - 这将是"C28"或"C29"
  • "type"属性后面的字符串 - 这将是"1AB010050093"或"1AB008140029"

所以,基本上,我需要从这个文件中获取所有部件引用和相关类型......而且我不确定这样做的最佳方法.

如果需要更多信息,请告知我们...提前感谢!

Ro *_* Mi 12

描述

这个表达式将:

  • 捕获组名称为 ref
  • 捕获typedescr字段的值.
  • 捕获时的Type字段应放入名为的命名组中 partnumber
  • 字段可以按正文中的任何顺序显示
  • descr字段是可选字段,只有在存在时才应捕获.该(?:... )?`` brackets around thedescr`场让现场可选

请注意,这是一个表达式,因此您将使用该x选项,以便正则表达式引擎忽略空格.

^part\s"(?P<ref>[^"]*)"[^{]*{
(?:(?=[^}]*\sdescr\s*:\s+"(?P<descr>[^"]*)"))?
(?=[^}]*\stype\s*:\s+"(?P<type>[^"]*)")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

PHP代码示例:

输入文本

part "C28"
{ type       : "1AB010050093",
  %cadtype   : "1AB010050094",
  shapeid    : "2_1206",
  descr      : "4700.0000 pFarad 10.00 % 100.0 - VE5-VS3",
  insclass   : "CP6A,CP6B",
  gentype    : "RECT_032_016_006",
  machine    : "SMT",
  %package   : "080450E",
  %_item_number: "508",
  %_Term_Seq : "" }
part "C29"
{ type       : "1AB008140029",
  shapeid    : "2_1206",
  descr      : "150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR",
  insclass   : "CP6A,CP6B",
  gentype    : "RECT_032_016_006",
  machine    : "SMT",
  %package   : "080450E",
  %_item_number: "3",
  %_Term_Seq : "" }
part "C30"
{ type       : "1AB0081400 30",
  shapeid    : "2_1206 30",
  insclass   : "CP6A,CP6B 30",
  gentype    : "RECT_032_016_006 30",
  machine    : "SMT 30",
  %package   : "080450E 30 ",
  %_item_number: "3 30 ",
  %_Term_Seq : "30" }
Run Code Online (Sandbox Code Playgroud)

<?php
$sourcestring="your source string";
preg_match_all('/^part\s"(?P<ref>[^"]*)"[^{]*{
(?:(?=[^}]*\sdescr\s*:\s+"(?P<descr>[^"]*)"))?
(?=[^}]*\stype\s*:\s+"(?P<partnumber>[^"]*)")/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
Run Code Online (Sandbox Code Playgroud)

火柴

$matches Array:
(
[ref] => Array
    (
        [0] => C28
        [1] => C29
        [2] => C30
    )

 [descr] => Array
    (
        [0] => 4700.0000 pFarad 10.00 % 100.0 - VE5-VS3
        [1] => 150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR
        [2] => 
    )

[partnumber] => Array
    (
        [0] => 1AB010050093
        [1] => 1AB008140029
        [2] => 1AB0081400 30
    )

)
Run Code Online (Sandbox Code Playgroud)