2010-07-13 16 views
6

के रूप में मिलान का उपयोग करके किसी सरणी से प्रतिस्थापन ढूंढना मेरे पास एक स्ट्रिंग है जिसमें एकाधिक मिलान (प्रतिशत अंक से घिरा कोई भी शब्द) और प्रतिस्थापन की एक सरणी हो सकती है - वे प्रत्येक प्रतिस्थापन की कुंजी हैं रेगेक्स कुछ कोड शायद समझा जाएगा कि बेहतर ...PHP preg_replace - कुंजी

$str = "PHP %foo% my %bar% in!"; 
$rep = array(
    'foo' => 'does', 
    'bar' => 'head' 
); 

वांछित परिणाम जा रहा है:

$str = "PHP does my head in!" 

मैं निम्नलिखित की कोशिश की है, जिनमें से कोई भी काम:

$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str); 
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str); 

इस प्रकार मैं बारी मदद के लिए ओवरफ्लो ढेर करने के लिए। कोई लेने वाला?

उत्तर

7
echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str); 

देता है:

 
PHP does my head in! 

देखें the docs for the modifier 'e'

+3

'ई' संशोधक PHP 5.5 के बाद से "बहिष्कृत और उपयोग अत्यधिक निराश" है। इस जवाब में उद्धृत दस्तावेज़ों के मुताबिक। Preg_replace_callback() का उपयोग करके एक वैकल्पिक समाधान प्रस्तुत किया गया है [यहां] (http://stackoverflow.com/questions/16237882/preg-replace-using-pattern-as-index-of-replacement-data-array) – user9645

+0

और 'e 'संशोधक PHP 7.0.0 के रूप में हटा दिया गया है। – Jpsy

2

आप eval संशोधक का उपयोग कर सकता है ...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str); 
1

बस preg_replace के लिए एक विकल्प प्रदान करने के लिए():

$str = "PHP %foo% my %bar% in!"; 
$rep = array(
    'foo' => 'does', 
    'bar' => 'head' 
); 


function maskit($val) { 
    return '%'.$val.'%'; 
} 

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str); 
echo $result; 
2

ऐसा लगता है कि आपरिवर्तक "ई" अनुचित है। सुरक्षा मुद्दे हैं। वैकल्पिक रूप से, आप preg_replace_callback का उपयोग कर सकते हैं।

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
          function($match) use ($rep) { return $rep[$match[1]]; }, 
          $str);