2012-10-02 13 views
5

के अंदर संलग्न सभी रिक्त स्थान को बदलें, जो मैं करना चाहता हूं वह सभी रिक्त स्थान है जो ब्रेसिज़ में संलग्न हैं, और फिर उन्हें किसी अन्य चरित्र से प्रतिस्थापित करें।ब्रेसिज़

कुछ की तरह:

{The quick brown} fox jumps {over the lazy} dog 

को बदलने के लिए में:

{The*quick*brown} fox jumps {over*the*lazy} dog 

मैं पहले से ही ऑनलाइन खोज की, लेकिन यह मैं अब तक क्या मिला है, और यह तो क्या मैं वास्तव में चाहते हैं उसके पास लगता है ।

preg_replace('/(?<={)[^}]+(?=})/','*',$string); 

ऊपर कोड के साथ मेरी समस्या यह है कि यह बदल देता है सब कुछ:

{*} fox jumps {*} dog 

मैं यह पता लगाने की कैसे मैं केवल रिक्त स्थान को बदलने के लिए ऊपर दिए गए कोड को संशोधित करना चाहिए regexp शिक्षण सामग्री में देख रहा था, लेकिन कोई लाभ नहीं हुआ । किसी भी इनपुट की अत्यधिक सराहना की जाएगी।

धन्यवाद।

+1

बस स्ट्रिंग के बीच में "*" वापस एक साथ रिक्त स्थान है और फिर बिल्ली के बीच विस्फोट जिसके परिणामस्वरूप सरणी के साथ। क्षमा करें मैं एक उदाहरण लिखने के लिए बहुत थक गया हूँ। – noel

उत्तर

5

यह मानते हुए कि सभी ब्रेसिज़ सही ढंग से नेस्टेड रहते हैं, और कोई नेस्टेड ब्रेसिज़ हैं, तो आप इस एक अग्रदर्शी दावे का उपयोग कर ऐसा कर सकते हैं:

$result = preg_replace('/ (?=[^{}]*\})/', '*', $subject); 

इस से मेल खाता है और एक अंतरिक्ष केवल तभी अगले ब्रेस एक बंद है बदल देता है ब्रेस: ​​

(?=  # Assert that the following regex can be matched here: 
[^{}]* # - Any number of characters except braces 
\}  # - A closing brace 
)  # End of lookahead 
+0

धन्यवाद। यह शानदार ढंग से काम किया। हालांकि, मैं php स्ट्रिंग फ़ंक्शंस (स्ट्रॉस, सबस्ट्रेट इत्यादि) का उपयोग करके समाधान का प्रयास कर रहा हूं। क्या आप अभी भी रेगेक्स का उपयोग कर सलाह देते हैं? मैंने रेगेक्स धीमा और ऐसा होने के बारे में पढ़ा है। – Bibokid

+2

@ बिबोकिड: आप ज़ैफ़ी और मेरे समाधान को प्रोफाइल कर सकते हैं और पता लगा सकते हैं - नियमित अभिव्यक्तियां आवश्यक रूप से धीमी नहीं होती हैं (लेकिन अक्सर उन्हें बहुत धीमी गति से बनाया जाता है, जिससे उन्हें धीमा कर दिया जाता है क्योंकि उन्हें एक समाधान को बलपूर्वक मजबूर करना पड़ता है जब एक चालाक समाधान भी उपलब्ध होता है) । कई मामलों में, रेगेक्स पुस्तकालयों को अत्यधिक अनुकूलित किया जाता है और स्ट्रिंग फ़ंक्शंस का उपयोग करके स्वयं को बनाए गए किसी भी समाधान से कहीं अधिक तेज़ हो सकता है। –

1

कैसे इस बारे में:

$a = '{The quick brown} fox jumps {over the lazy} dog'; 
$b = preg_replace_callback('/\{[^}]+\}/sim', function($m) { 
    return str_replace(' ', '*', $m[0]); 
}, $a); 
var_dump($b); // output: string(47) "{The*quick*brown} fox jumps {over*the*lazy} dog" 
+0

धन्यवाद। मैं इसे भी कोशिश करूंगा और अन्य समाधानों की तुलना करूंगा। – Bibokid

2

मैं यो पर प्रतिक्रिया कर रहा हूँ आप टिप्पणी करते हैं कि आप रेगेक्स का उपयोग नहीं करना चाहते हैं, बस स्ट्रिंग मैनिपुलेशन। यह ठीक है लेकिन फिर आपने लिखा है कि आप रेगेक्स की तलाश में हैं? regex wihout

समाधान:

<?php 

$str = "{The quick brown} fox jumps {over the lazy} dog"; 

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++) 
{ 
    switch($str[$i]) 
    { 
     case '{': $b = true; continue; 
     case '}': $b = false; continue; 
     default: 
     if($b && $str[$i] == ' ') 
      $str[$i] = '*'; 
    } 
} 

print $str; 

?> 
+0

यह वही था जब मैं स्टैक ओवरफ्लो में प्रतिक्रिया के लिए इंतजार कर रहा था, मैं एक गैर-रेगेक्स समाधान के साथ प्रयोग कर रहा था जो मेरे सिर में आया था। इसके लिए धन्यवाद, मैं इसे भी आज़मा दूंगा। – Bibokid

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