2015-12-21 1 views
0

Каждый знает, как изменить скребок ниже, чтобы достичь желаемого результата:PHP - иглы в поиске стоге не работает, когда в окружении подобного сена стеков

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

Код может быть выбежала онлайн @http://ideone.com/QATj5a

Результат:

Array ([0] => this is a bunch of hay hay1= Gold_Needle [1] => Silver_Needle) 

Желаемая Результат:

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

ответ

2

Использование $starts и $ends массив построить опережения регулярное выражение так:

(hay1=\h*\K(?:.(?!hay1))*?(?= hay=Gold))|(hay2=\h*\K(?:.(?!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'; 

$needle1_Begin='hay1='; 
$needle2_Begin='hay2='; 

$needle1_End='hay=Gold'; 
$needle2_End='hay=Silver'; 

$starts = array($needle1_Begin,$needle2_Begin); 
$ends = array($needle1_End,$needle2_End); 

$re = array_reduce($starts, function($res, $e) use (&$ends) { 
    $res .= '(' . $e . '\h*\K(?:.(?!' . $e . '))*?(?= ' . current($ends) . '))|'; 
    next($ends); return $res;}); 

$re = '/' . substr($re, 0, -1) . '/'; 

if (preg_match_all($re, $haystack, $m)) 
    print_r($m[0]); 

выход:

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

Спасибо за вход! «Запускает» и «концы» в коде будут переменными, например, я ввел отредактированный код @ http://ideone.com/QATj5a. Например: $ needle1_Begin = 'hay1 ='; $ needle2_Begin = 'hay2 ='; \t \t \t $ needle1_End = 'hay = Gold'; $ needle2_End = 'hay = Silver'; Поэтому я не уверен в том, чтобы поместить их в регулярное выражение. Число этих переменных будет расти. Там могут быть десятки, такие как $ needle55_Begin и так далее. Идеи? Благодаря! – ven

+1

Отличный ответ ...! +1 – stack

+0

Кстати, у меня действительно тяжело [вопрос] (http://stackoverflow.com/questions/34406286/how-to-prevent-of-re-replacing-by-second-regex). У вас есть значок с золотым регулярным выражением, не могли бы вы взглянуть на него? * (предварительно) * спасибо. – stack

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