提取具有不可预测内容的可预测结构字符串的特定部分


Extracting specific parts of a predictably structured string with unpredictable contents

好的,我有一个复杂的问题要问你们。

我正试图从一堆旧数据中提取一些值。这是一组字符串,基本上是由|| 连接的7个部分组成

test1||keep||1:1||test||3462||7885||test

规则

  • 字符串的每个部分都可以有任何字符,除了|或像<>这样的两个箭头(请参阅下面的内容),它们被保留为分隔符。

  • 任何部分都可能是空的。

例如,在本例中,前1、第5和第6部分为空,第3部分包含许多非字母数字字符。

||keep||test's' (o-kay?).go_od||test||||||test

此外

一些字符串由这7个字符串中的多个组成,并用<> 进一步分隔

test1||keep||1:1||test||3462||7885||test<>test1||keep||1:1||test||3462||7885||test<>test1||keep||1:1||test||3462||7885||test

请记住,任何内部部分都可能是空的。

test54||keep||test's' (o-kay?).go_od||test||||||<>test||keep||test545's'/.||test||||test||test

目标

只提取每个字符串的第二部分,并放入一个数组中。在我上面的例子中,每个部分都有单词keep

因此,对于这个例子:

||keep||test's' (o-kay?).go_od||test||||||test

我想得到:

array('keep')

例如:

test1||keep-me||1:1||test||3462||7885||test<>||keep||||||3462||7885||<>test1||keep-me-too!||1:1||test||3462||||test

可以看到由<>:分隔的3个不同的字符串

test1||keep-me||1:1||test||3462||7885||test
||keep||||||3462||7885||
test1||keep-me-too!||1:1||test||3462||||test

我想提取:

array('keep-me', 'keep', 'keep-me-too!')

票据

我尝试过用preg_match来做这件事,但look-behind不喜欢搜索非固定长度的字符串。

我无法更改数据。这是我必须要处理的旧数据。

$array = [];
$strings = explode('<>', $yourContent);
foreach ($strings as $string) {
    $array[] = explode('||', $string)[1];
}

这使用了PHP 5.4中引入的数组去引用。