2015-12-21 1 views
0

Quelqu'un sait comment modifier le grattoir ci-dessous pour obtenir le résultat souhaité:PHP - Une aiguille dans une recherche de botte de foin ne fonctionne que quand il est entouré par des piles de foin similaire

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

Le code peut être exécuté en ligne @http://ideone.com/QATj5a

Le résultat est:

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

souhaitee Le résultat est:

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

Répondre

2

Utilisez $starts et $ends tableau pour construire un masque comme lookahead ceci:

(hay1=\h*\K(?:.(?!hay1))*?(?= hay=Gold))|(hay2=\h*\K(?:.(?!hay2))*?(?= hay=Silver)) 

code:

$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]); 

sortie:

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

Merci pour l'entrée! Les "départs" et "fins" dans le code seront des variables, comme j'ai mis dans le code édité @ http://ideone.com/QATj5a. Comme ceux-ci: $ needle1_Begin = 'hay1 ='; $ needle2_Begin = 'hay2 ='; \t \t \t $ needle1_End = 'foin = Or'; $ needle2_End = 'foin = Argent'; Donc je ne suis pas sûr de les mettre dans l'expression rationnelle. Le nombre de ces variables va augmenter. Il pourrait y avoir des dizaines comme $ needle55_Begin et ainsi de suite. Des idées? Merci! – ven

+1

Bonne réponse ...! +1 – stack

+0

btw, j'ai une question très difficile (http://stackoverflow.com/questions/34406286/how-to-prevent-of-re-replacing-by-second-regex). Vous avez un badge regex en or, pouvez-vous jeter un coup d'œil? * (à l'avance) * merci. – stack