2014-10-28 8 views
6

मैं तो इस तरह की स्ट्रिंग से आम मास्क बनाने के लिए कोशिश कर रहा हूँ:परिणामों को ओवरलैप किए बिना स्ट्रिंग के भीतर एकाधिक स्ट्रिंग्स को मैं कैसे बदल सकता हूं?

012abc.d+e_fg~hijk => 012{start}.d+{middle}_fg~{end}jk 

बदल देते हैं:

$arrFromTo = array(
       'st' => '{pre}', 
       'abc' => '{start}', 
       'e' => '{middle}', 
       'hi' => '{end}', 
       'dd' => '{post}' 
      ); 

इसके बजाय मैं बजाय (str_replace के एक पाश का उपयोग कर प्रतिस्थापन ओवरलैपिंग रखने के लिए और कुछ इस तरह मिल ' ओं):

012{{pre}art}.d+{mi{post}le}_fg~{end}jk 

क्योंकि st पहले से ही में पाया जाता है प्रतिस्थापित {start} और dd{middle} में पाया गया है।

आप निम्न को कैसे प्रतिस्थापित करेंगे?

$str = 'abc.d+e_fg~hijk'; 

echo replace_vars($str); // Desired output: 012{start}.d+{middle}_fg~{end}kJ 
+0

मैं सरणी को पुनर्व्यवस्थित करने के बारे में सोच रहा था इसलिए 'dd '=>' {post} '' एक अलग स्थिति में था, लेकिन इससे अन्य मुद्दों को उठाया गया। –

+0

अक्सर मैं रेगेक्स का सुझाव नहीं देता हूं, लेकिन इस मामले में यह समझदार हो सकता है ताकि आप –

+0

@scrowler को प्रतिस्थापित करने से पहले जो उम्मीद कर रहे हैं उसकी जांच करने के लिए आप लुकहेड/बैक करें। दुर्भाग्य से मेरे पीसीआर लाइब्रेरी में परिवर्तनीय लंबाई नकारात्मक दिखने के साथ एक बग है। मैं पीसीआरई लाइब्रेरी को अपग्रेड करने में असमर्थ हूं इसलिए मैंने इस बिंदु पर उस पथ को छोड़ना बंद कर दिया। – Ryan

उत्तर

6

मुझे गलत समझा जा सकता है, लेकिन आपको प्रतिस्थापन के लिए रेगेक्स की आवश्यकता नहीं लगती है। वे सरल, शाब्दिक प्रतिस्थापन हैं।

$from = '012abc.d+e_fg~hijk'; 
$arrFromTo = array(
       'st' => '{pre}', 
       'abc' => '{start}', 
       'e' => '{middle}', 
       'hi' => '{end}', 
       'dd' => '{post}' 
      ); 
$to = strtr($from, $arrFromTo); // 012{start}.d+{middle}_fg~{end}jk 

strtr() शानदार है। यह एक बहुत ही पठनीय इनपुट लेता है और यह लूप में आपकी समस्या की तरह पुनः प्रतिस्थापित नहीं करता है।

2

आप preg_replace इस तरह उपयोग कर सकते हैं:

$str = '012abc.d+e_fg~hijk'; 
$arrFromTo = array(
       'st' => '{pre}', 
       'abc' => '{start}', 
       'e' => '{middle}', 
       'hi' => '{end}', 
       'dd' => '{post}' 
      ); 

$reArr=array(); 
foreach($arrFromTo as $k=>$v){ 
    $reArr['/' . $k . '(?![^{}]*})/'] = $v; 
} 

echo preg_replace(array_keys($reArr), array_values($reArr), $str); 
//=> 012{start}.d+{middle}_fg~{end}jk 

इस regex की कोर इस नकारात्मक lookaead है: (?![^{}]*})

कौन सा सरणी के मिलान कुंजी से बचने के बाद से ही वह {...} में संलग्न है सब प्रतिस्थापन {...} में संलग्न हैं।

+0

क्यों 'preg_replace'? क्यों नहीं 'str_replace' या' strtr'? कोई regexing आवश्यक है, वहाँ है? – Rudie

+0

आप 'str_replace' में लुकहेड का उपयोग कैसे कर सकते हैं? – anubhava

+1

आपको लुकहेड की आवश्यकता क्यों है ?? वे शाब्दिक प्रतिस्थापन हैं ... स्रोत स्ट्रिंग में कोई '{' और '}' नहीं है। – Rudie

0

यह प्रत्येक प्रतिस्थापन के क्रम में स्ट्रिंग को खोजेगा। यदि यह एक पाता है, तो यह स्ट्रिंग को विभाजित करेगा, और स्ट्रिंग के बाकी हिस्सों को किसी भी अन्य प्रतिस्थापन के लिए खोज करेगा।

$str = '012abc.d+e_fg~hijk'; 

$rep = array(
    'st' => '{pre}', 
    'abc' => '{start}', 
    'e' => '{middle}', 
    'hi' => '{end}', 
    'dd' => '{post}' 
); 

$searched = ''; 

foreach ($rep as $key => $r) { 
    if (strpos($str, $key) !== false) { 

     $searched .= substr($str, 0, strpos($str, $key)) . $r; 
     $str = substr($str, strpos($str, $key) + strlen($key)); 

    } 
} 

$searched .= $str; 

echo $searched; //012{start}.d+{middle}_fg~{end}jk 

यह खोज और उन्हें आदेश आपके द्वारा उल्लिखित में मिल जाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे