2015-12-18 5 views
1

У меня есть код, который скрещивает строку между двумя другими строками (сэндвич). Он работает, но мне нужно перебирать различные «сэндвич-строки».Простые скрещивания данных с использованием PHP loop/foreach

//needle in haystack 
$result 'sandwich: Today is a nice day. 
    sandwich: Today is a cloudy day. 
    sandwich: Today is a rainy day. 
    sandwich type 2: Yesterday I had an awesome time. 
    sandwich type 2: Yesterday I had an great time.'; 

$beginString = 'today is a'; 
$endString = 'day'; 

function extract_unit($haystack, $keyword1, $keyword2) { 
    $return = array(); 

    while($a = strpos($haystack, $keyword1, $a)) { // loop until $a is FALSE 
     $a+=strlen($keyword1);     // set offset to after $keyword1 word 

     if($b = strpos($haystack, $keyword2, $a)) { // if found $keyword2 position's 
      $return[] = trim(substr($haystack, $a, $b-$a)); // put result to $return array 
     } 
    } 
    return $return; 
} 

$text = $result; 
$unit = extract_unit($text, $beginString, $endString); 
print_r($unit); 

//$unit returns= nice, cloudy and rainy 

мне нужно перебрать различные типы предложений/бутербродов и быть в состоянии охватить все прилагательные (хороший облачный дождливый удивительный большой):

//needle in haystack 
$result 'sandwich: Today is a nice day. 
    sandwich: Today is a cloudy day. 
    sandwich: Today is a rainy day. 
    sandwich type 2: Yesterday I had an awesome time. 
    sandwich type 2: Yesterday I had an great time.'; 

$beginString1 = 'today is a'; 
$endString1 = 'day'; 
$beginString2 = 'Yesterday I had an'; 
$endString2 = 'time'; 

[scaping code with loop...] 
print_r($unit); 

Это цель, чтобы в итоге этот массив:

Array ([0] => nice [1] => cloudy [2] => rainy [3] => awesome [4] => great) 

Любые идеи? Очень признателен.

ответ

3

Вы можете использовать регулярные выражения, чтобы скоблить в strings, если у вас нет проблем с использованием arrays вместо разделенных strings, это может быть образец кода, чтобы сделать это:

$starts = array('Today is a', 'Yesterday I had an'); 
$ends = array('day', 'time'); 

$haystack = array(
    'Today is a nice day.', 
    'Today is a cloudy day.', 
    'Today is a rainy day.', 
    'Yesterday I had an awesome time.', 
    'Yesterday I had an great time.' 
); 

function extract_unit($haystack, $starts, $ends){ 

    $reg = '/.*?(?:' . implode('|', $starts) . ')(.*?)(?:' . implode('|', $ends) . ').*/'; 

    foreach($haystack as $str){ 

     if(preg_match($reg, $str)) $return[] = preg_replace($reg, '$1', $str); 

    } 

    return $return; 

} 

print_r (extract_unit($haystack, $starts, $ends)); 

EDIT

После @ven комментариев я сделал некоторые изменения в код, теперь является более точным:

//---Array with all sandwiches 
$between = array(
    array('hay1=', 'hay=Gold'), 
    array('hay2=', 'hay=Silver') 
); 

$haystack = 'Data set 1: hay2= this is a bunch of hay hay1= Gold_Needle hay=Gold 
      Data Set 2: hay2=Silver_Needle hay=Silver'; 

function extract_unit($haystack, $between){ 

    $return = array(); 

    foreach($between as $item){ 

     $reg = '/.*?' . $item[0] . '\s*(.*?)\s*' . $item[1] . '.*?/'; 

     preg_match_all($reg, $haystack, $finded); 

     $return = array_merge($return, $finded[1]); 

    } 

    return $return; 

} 

print_r (extract_unit($haystack, $between)); 

Результат будет:

Array 
(
    [0] => Gold_Needle 
    [1] => Silver_Needle 
) 

Here you have an Ideone sample code

+0

@ideone - большое спасибо! ... но я получаю сообщение об ошибке: preg_match_all ($ reg, $ haystack, $ return); в котором говорится: «Ошибка анализа: синтаксическая ошибка, неожиданная« preg_match_all »(T_STRING) в«. Думаю, это сработает для вас? - Я попробовал отредактированную версию, где стога сена - единственная строка. – ven

+0

У вас есть онлайн-пример в конце, и вы можете разблокировать этот код и сделать свои собственные тесты. Какая у вас версия PHP? – ElChiniNet

+0

Я забыл «;» в конце предыдущей строки в примере кода это была моя ошибка. Я исправил это. – ElChiniNet