2013-07-11 2 views
0

Хорошо, у меня сложная проблема для вас, ребята.Извлечение определенных частей строки с предсказуемой структурой с непредсказуемым содержимым

Я пытаюсь извлечь некоторые значения из загрузки старых данных. Это куча строк, которые в основном 7 частей объединяется с ||

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

правил

  • Каждая секция строки может иметь любой характер в нем, кроме | или двумя стрелками например, <> (см. ниже), которые зарезервированы как разделители.

  • Любой из разделов может быть пустым.

например. В этом первом первом, пятом и шестом разделах пусто, а третий содержит много не буквенно-цифровых символов.

||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 

Цель

Extract только вторая часть каждой строки, и поместить в массив. В моих примерах выше, каждая часть имеет слово 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 но смотреть-за не любит поиске строк, не фиксированной длины ,

Я не могу изменить данные. Это старые данные, с которыми мне просто нужно работать.

+0

Опубликовать ваши попытки ... –

+1

взорваться на '<>', а затем взорвать каждую часть на '||'? – andrewsi

+0

@andrewsi Возможно, это и должно быть. – BadHorsie

ответ

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

Это использование разыменования массивов, введенное в PHP 5.4.

+0

Спасибо, я проверю это и отчитаюсь, поскольку я должен сделать это на 8000 строках данных, а затем прокрутить каждый из 8000 наборов результатов. – BadHorsie

+0

Да, проблем нет, спасибо. – BadHorsie

Смежные вопросы