我正在使用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)) {
希望这是有道理的。任何帮助将非常感激!谢谢!
答案 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
)