我需要通过块将数据传递给数组,我该怎么做?我需要使用正则表达式吗?我的脚本给了我错误,因为我无法按照自己的意愿将其分开。有没有人有任何想法?
数据:
~0
11111111
~1
222222222
~2
3333333333
~end
~0
aaaaaaaaaaa
~1
bbbbbbbbbb
~2
cccccccccc
~3
ddddddddddd
~end
~0
yyyyyyyyyyy
xxxxxxxx
ffffffffff
~1
rrrrrrrrrrrr
~end
我需要这样:
Array (
[0] => Array
(
[0] => 11111111
[1] => 222222222
[2] => 3333333333
)
),
[1] => Array
(
[0] => aaaaaaaaaaa
[1] => bbbbbbbbbb
[2] => cccccccccc
[3] => ddddddddddd
)
),
[2] => Array
(
[0] => yyyyyyyyyyy
xxxxxxxx
ffffffffff
[1] => rrrrrrrrrrrr
)
),
)
我的代码(失败):
$texto = "~0
11111111
~1
222222222
~2
3333333333
~end
~0
aaaaaaaaaaa
~1
bbbbbbbbbb
~2
cccccccccc
~3
ddddddddddd
~end
~0
yyyyyyyyyyy
xxxxxxxx
ffffffffff
~1
rrrrrrrrrrrr
~end";
preg_match_all("/(?ms)^~0.*?~end/", $texto, $coincidencias);
foreach ( $coincidencias[0] as $bloque ){
preg_match_all("/\~.*\n/", $bloque, $sub_bloques);
$hola[] = $sub_bloques;
}
答案 0 :(得分:3)
这是一种非正则表达方式:将字符串拆分为行并迭代它们。检查您指定的条件,如果满足条件,则将每行添加到子数组中。然后当你到达class Main extends React.Component {
render() {
return (
<div>
<h1>Login Status: { state.isLoggedIn }</h1>
<button onClick={this.props.login}>Login</button>
</div>
)
}
}
const render = () => {
ReactDOM.render(<Main status={store.getState().isLoggedIn} login={() => store.dispatch({ type: 'TOGGLE' })}/>, document.getElementById('root'));
}
store.subscribe(render);
render();
行时,将子数组附加到主数组。
~end
对于正则表达式解决方案,首先在$sub_bloques = [];
$hola = [];
foreach(array_map('trim', explode("\n", $texto)) as $line) {
if ($line && substr($line, 0, 1) !== '~') {
$sub_bloques[] = $line;
}
if ($line == '~end') {
$hola[] = $sub_bloques;
$sub_bloques = [];
}
}
上展开以将主要文本分成多个部分,然后在部分~end
上查找符合条件的行。
preg_match_all
foreach (explode('~end', $texto, -1) as $section) {
preg_match_all('/\n *(?!~)(\w+)/', $section, $matches);
if ($matches[1]) $result[] = $matches[1];
}
是一个负面的背后隐藏,可以排除以(?!~)
开头的行。也许有一些方法可以用一个很酷的正则表达式完成整个事情,但我对它并不擅长。
答案 1 :(得分:0)
因为您希望将子块分成输出数组中的块,所以方法中需要有两个步骤。原因是您的子块具有不同的捕获组计数,正则表达式不允许这种可变性。
代码:
// This delivers the sub-blocks in their relative blocks as requested in the OP
foreach (preg_split('/\s+~end\s*/',$texto) as $bloque) {
if(preg_match_all('/(?:\~\d+\s+)\K.+?(?:\s+\S+)*?(?=\s+\~|$)/',$bloque,$sub_bloques)){
$hola[]=$sub_bloques[0];
}
}
var_export($hola);
输出*重新格式化/压缩以节省此页面上的空间(View Demo):
array(
array('11111111','222222222','3333333333'),
array('aaaaaaaaaaa','bbbbbbbbbb','cccccccccc','ddddddddddd'),
array('yyyyyyyyyyy
xxxxxxxx
ffffffffff','rrrrrrrrrrrr')
)
或者,如果您希望将所有子块列在1-dim数组中(不按块分割),则可以一步构建输出数组:
if(preg_match_all("/(?:\~\d+\s*)\K.+?(?:\s+\S+)*?(?=\s+\~)/s", $texto, $coincidencias)){
var_export($coincidencias[0]);
}
1-dim输出:
array (
0 => '11111111',
1 => '222222222',
2 => '3333333333',
3 => 'aaaaaaaaaaa',
4 => 'bbbbbbbbbb',
5 => 'cccccccccc',
6 => 'ddddddddddd',
7 => 'yyyyyyyyyyy
xxxxxxxx
ffffffffff',
8 => 'rrrrrrrrrrrr',
)