2012-06-24 15 views
27

मैं निम्न HTML बयानpreg_replace_callback का उपयोग कैसे करें?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

मुझे क्या करना कोशिश कर रहा हूँ एक html div साथ [otsection] टैग की जगह है। पकड़ रहा से 1-> 2-> 3, आदि div की आईडी को बढ़ाने के लिए चाहते हैं ..

उदाहरण के लिए, ऊपर बयान

<div class="otsection" id="1">Wallpapers</div> 
WALLPAPERS GO HERE 

<div class="otsection" id="2">Videos</div> 
VIDEOS GO HERE 

को मैं के रूप में अनुवाद किया जाना चाहिए जहां तक शोध कर सकते हैं, ऐसा करने का सबसे अच्छा तरीका प्रत्येक प्रतिस्थापन के बीच आईडी चर को बढ़ाने के लिए preg_replace_callback के माध्यम से है। लेकिन इस पर काम करने के 1 घंटे बाद, मैं इसे काम नहीं कर सकता।

इसके साथ कोई सहायता बहुत सराहना की जाएगी!

उत्तर

38

उपयोग निम्नलिखित:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    function($m) { 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    }, 
    $in); 

विशेष रूप से, ध्यान दें कि मैं एक static चर का इस्तेमाल किया। यह चर फ़ंक्शन पर कॉल में बनी रहती है, जिसका अर्थ यह है कि प्रत्येक बार फ़ंक्शन कहलाए जाने पर इसे बढ़ाया जाएगा, जो प्रत्येक मैच के लिए होता है।

इसके अलावा, ध्यान दें कि मैंने आईडी में ots तैयार किया है। तत्व आईडी संख्याओं से शुरू नहीं होनी चाहिए।


पीएचपी के लिए 5.3 से पहले:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    create_function('$m',' 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    '), 
    $in); 
+0

आप विषय के साथ '$ in'' कैसे प्राप्त कर सकते हैं? –

+0

@ शेखहेरा वह पहले से ही होना चाहिए। डेटा आमतौर पर कहां जाता है और बाहर आता है यह दिखाने के लिए मैं आमतौर पर '$ in' और' $ out' का उपयोग करता हूं। –

+0

अच्छा जवाब, वैसे भी। –

22

नोट: निम्नलिखित एक सामान्य जवाब में किया जाता है और के रूप में यह पहले से ही किया गया है addressed before ओपी की विशिष्ट समस्या को हल करने का प्रयास नहीं करता ।

preg_replace_callback() क्या है?

यह फ़ंक्शन नियमित अभिव्यक्ति खोज-और-प्रतिस्थापन करने के लिए उपयोग किया जाता है। यह str_replace() के समान है, लेकिन सादे तारों के बजाय, यह उपयोगकर्ता द्वारा परिभाषित रेगेक्स पैटर्न की खोज करता है, और उसके बाद मिलान किए गए आइटम पर कॉलबैक फ़ंक्शन लागू करता है। यदि मिलान मिलते हैं, तो असम्बद्ध स्ट्रिंग अन्यथा संशोधित स्ट्रिंग देता है।

मुझे इसका उपयोग कब करना चाहिए?

preg_replace_callback() बहुत preg_replace() के समान है - फर्क सिर्फ इतना है कि बजाय दूसरा पैरामीटर के लिए एक स्थानापन्न स्ट्रिंग को निर्दिष्ट करने के लिए, आप एक callback समारोह निर्दिष्ट है।

जब आप एक साधारण रेगेक्स खोज और प्रतिस्थापन करना चाहते हैं तो preg_replace() का उपयोग करें। जब आप बस प्रतिस्थापन से अधिक करना चाहते हैं तो preg_replace_callback() का उपयोग करें। यह कैसे काम करता है यह समझने के लिए नीचे दिया गया उदाहरण देखें।

इसका उपयोग कैसे करें?

फ़ंक्शन के उपयोग को चित्रित करने के लिए यहां एक उदाहरण दिया गया है। यहां, हम YYYY-MM-DD प्रारूप से DD-MM-YYYY पर दिनांक स्ट्रिंग को बदलने की कोशिश कर रहे हैं।

// our date string 
$string = '2014-02-22'; 

// search pattern 
$pattern = '~(\d{4})-(\d{2})-(\d{2})~'; 

// the function call 
$result = preg_replace_callback($pattern, 'callback', $string); 

// the callback function 
function callback ($matches) { 
    print_r($matches); 
    return $matches[3].'-'.$matches[2].'-'.$matches[1]; 
} 

echo $result; 

यहाँ, हमारे रेगुलर एक्सप्रेशन पैटर्न प्रारूप NNNN-NN-NN की तारीख स्ट्रिंग के लिए खोज करता है, जहां N लेकर 0 से अंक के हो सकता है - 9 (\d चरित्र वर्ग [0-9] के लिए एक आशुलिपि प्रतिनिधित्व है)। कॉलबैक फ़ंक्शन को दिए गए स्ट्रिंग में मिलान किए गए तत्वों की एक सरणी कहा जाएगा और पास किया जाएगा।

अंतिम परिणाम हो जाएगा:

22-02-2014 

नोट: ऊपर के उदाहरण चित्रण प्रयोजनों के लिए ही है। आप को पार्स तिथियों के लिए उपयोग नहीं करना चाहिए। इसके बजाय DateTime::createFromFormat() और DateTime::format() का उपयोग करें। This question में अधिक जानकारी है।