決して完璧な解決策ではありませんが、利用可能なテスト データを使用すると、次のようにすると目的の出力が返されます。
$str = 'SI_NurbsCurve Edge1 {
1,
0,
0,
4,
0,0,1,1,
2,
870.243,1229.35,143.395,1
927.537,1323.53,103.842,1
}
SI_NurbsCurve Edge2 {
1,
0,
0,
4,
0,0,1,1,
2,
899.54,1217.88,116.255,1
870.243,1229.35,143.395,1
}';
function stripExtra( $inElem ){
return !preg_match( '/^(?:(?:[0124](?:,0,1,1)?\,)|(?:\})|(?:SI_NurbsCurve Edge.+ \{))$/' , $inElem );
}
$arr2 = array_filter( array_map( 'trim' , explode( "\n" , preg_replace( "/\,1\s+\n/" , ",\n" , $str ) ) ) , 'stripExtra' );
var_dump( $arr2 );
# Returns
# array(5) {
# [7]=>
# string(25) "870.243,1229.35,143.395,"
# [8]=>
# string(25) "927.537,1323.53,103.842,"
# [10]=>
# string(0) ""
# [18]=>
# string(24) "899.54,1217.88,116.255,"
# [19]=>
# string(25) "870.243,1229.35,143.395,"
# }
ソリューションをたどる...
function stripExtra( $inElem ){
return !preg_match( '/^(?:(?:[0124](?:,0,1,1)?\,)|(?:\})|(?:SI_NurbsCurve Edge.+ \{))$/' , $inElem );
}
この関数は、提示された文字列と一致します。提供された文字列が特定のパターンに一致するかどうかに応じて、true または false が返されます。これにより、後の段階で不要な行を削除できます。ここで使用されるパターンは、次の行に一致します。
SI_NurbsCurve Edge1 {
0,
1,
2,
4,
0,0,1,1,
}
注: 1 つ以上のスペースが前に付いていない場合にのみ、これらの行に一致します。しかし、最終的な出力ではすべてのスペースが取り除かれているため、大したことではありません。
したがって、読みやすくするために、ここで 1 行の不思議を複数の行に置き換えて、より適切に説明できるようにします。
$arr2 = preg_replace( "/1\s+\n/" , "\n" , $str );
これにより、要求に応じて、行末の「,1」のインスタンスがコンマだけに置き換えられます。
$arr2 = explode( "\n" , $arr2 );
これにより、改行文字に基づいて文字列が分割され、各行が新しい要素を形成する配列が作成されます。
$arr2 = array_map( 'trim' , $arr2 );
これは、array_map()
関数 ( PHP Documentationtrim()
) を使用して関数( PHP Documentation ) をそれぞれに適用し、各要素から先頭および/または末尾のスペースを削除します。
$arr2 = array_filter( $arr2 , 'stripExtra' );
上で書いた関数を覚えていますか? 次に、配列を移動し、各要素をテストします。上記の行と一致しない場合、それらは配列に保持されます。それらが上記の不要な行と一致する場合、その要素は配列から削除されます。