preg_match_all具有多种可能性的输出

时间:2017-08-06 03:34:34

标签: php preg-match-all

我正在使用preg_match_all搜索一行,但不知道该行的确切含义。例如,它可能如下所示:

XXX012-013-015-######

或者看起来像这样:

XXX012-013-015-XXX001-002-######

'X是任何字母,'#是任意数字。

这是preg_match_all代码的相关部分,如果该行始终像第一个示例一样设置,则该部分完全按预期工作:

if (preg_match_all('([A-Z]{3})((?:[0-9]{3}[->]{1}){1,32})([0-9]{2})([0-9]{2})([0-9]{2})...rest of code...#', $wwalist, $matches)) {

$wwaInfo['locationabbrev'][$wwanum] = $matches[2][$keys[$wwanum]];

}

$matches[2]将按预期显示“012-013-015”。由于第一部分xxx012-013-015可以重复,我需要preg_match_all $ matches [2]如果在第二个例子上运行则显示以下内容:

012-013-015-001-002

这是我的尝试,但它不起作用:

if (preg_match_all('#([A-Z]{3})((?:[0-9]{3}[->]{1}){1,32})((?:[A-Z]{3}){0,1})(?:((?:[0-9]{3}[->]{1}){1,3}){0,3})([0-9]{2})([0-9]{2})([0-9]{2})...rest of code...#', $wwalist, $matches)) {

希望这是有道理的。任何帮助将非常感激!谢谢!

2 个答案:

答案 0 :(得分:1)

您无法在同一步骤中匹配和加入匹配。

这对你有用吗?

代码:(https://react-styleguidist.js.org/docs/documenting.html)(Pattern Demo

$strings=[
    'ABC012-013-015-XYZ001-002-345435',
    'ABC012-013-015-345453',
    'XYZ013-014-015-016-EFG017-123456'
];

foreach($strings as $s){
    if(preg_match('/[A-Z]{3}\d{3}/',$s)){  // check if string qualifies
        echo 'Match found.  Prepared string: ';
        $s=preg_replace('/([A-Z]{3}|-\d{6})/','',$s);  // remove unwanted substrings
        echo "$s\n";
    }
}

输出:

Match found.  Prepared string: 012-013-015-001-002
Match found.  Prepared string: 012-013-015
Match found.  Prepared string: 013-014-015-016-017

答案 1 :(得分:0)

您可以使用替换调用,然后输出带有匹配项的新字符串,例如:

ABC012-013-015-XYZ001-002-345435
ABC012-013-015-345453
XYZ013-014-015-016-EFG017-123456

$rep = preg_replace( '/(?mi-Us)([^0-9-\n]{3,})|-[0-9]{4,}/', '', $str) ;
echo ( $rep );

应该导致:

012-013-015-001-002
012-013-015
013-014-015-016-017

输出到数组:

$mat = preg_match_all( '/([0-9-]+)\n/', $rep, $res) ;
print_r( $res[1] ) ;

foreach( $res[1] as $result ) {
    echo $result . "\n" ;
}

对于您所展示的代码,您可能会这样做:

$rep = preg_replace( '/(?mi-Us)([^0-9-\n]{3,})|-[0-9]{4,}/', '', $wwalist ) ;

if (preg_match_all('/([0-9-]+)\n/', $rep, $matches)) {

    $wwaInfo['locationabbrev'][$wwanum] = $matches[1][$keys[$wwanum]];
    print_r( $wwaInfo['locationabbrev'][$wwanum] ); // comment out when done testing
}

哪个应该返回数组:

Array
(
    [0] => 012-013-015-001-002
    [1] => 012-013-015
    [2] => 013-014-015-016-017
)