使用不可预测的内容提取可预测结构化字符串的特定部分

时间:2013-07-11 16:12:15

标签: php regex

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

我正在尝试从一堆旧数据中提取一些值。它是一堆字符串,基本上是与||

连接的7个部分
test1||keep||1:1||test||3462||7885||test

规则

  • 字符串的每个部分都可以包含其中的任何字符,|除外,或者像<>这样的两个箭头(请参见下文)保留为分隔符。

    < / LI>
  • 任何部分都可能为空。

e.g。在这一个中,第一个,第五个和第六个部分是空的,第三个部分包含许多非字母数字字符。

||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执行此操作,但后悔不喜欢搜索非固定长度的字符串。

我无法更改数据。这是我必须使用的旧数据。

1 个答案:

答案 0 :(得分:0)

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

这使用PHP 5.4中引入的数组解除引用。