2012-03-07 9 views
5

मैं इस तरह कुछ कोड है, जो एक लिंक के साथ कुछ लघुकोड बदल देता है:PHP में एक सशर्त preg_replace है?

$search = array(
    '#\{r\|([^|]+)\|([^}]+)\}#', 
    '#\{t\|([^|]+)\|([^}]+)\}#', 
    ..., 
); 

$replace = array(
    '<a href="/ref/$1">$2</a>', 
    '<a href="/type/$1">$2</a>', 
    ..., 
); 

$content = preg_replace($search, $replace, $content); 

मैं बहुत अधिक है कि इसी तरह तो मैं सोच रहा था रहे हैं, वहाँ किसी तरह एक सशर्त के साथ एक सरल preg_replace को यह कम करने के लिए है ?

उदाहरण के लिए, regex #\{([a-z])\|([^|]+)\|([^}]+)\}# का उपयोग करें और पहले अक्षर को अपने अक्षर के आधार पर कुछ अलग (आर = रेफ, टी = प्रकार) के साथ बदलें? (यदि यह मदद करता है, लघुकोड {r|url-slug|LinkTitle} की तरह हैं।)

उत्तर

9

यह (या शायद सिर्फ /e eval संशोधक) preg_replace_callback के लिए कहता है, जो आप मानचित्रण डाल करने की अनुमति होगी t = type और r = ref प्रतिस्थापन तर्क में:

= preg_replace_callback('#\{([rt])\|([^|]+)\|([^}]+)\}#', "cb_123", ... 

function cb_123($m) { 

    $map = array("t" => "type", "r" => "ref"); 
    $what = $map[ $m[1] ]; 

    return "<a href=\"/$what/$m[2]\">$m[3]</a>"; 
} 
3

अस्वीकरण: क्या नीचे इस प्रकार भयानक सलाह है, और एक PHP सुविधा है कि काफी ठीक ही अब पदावनत के उपयोग का सुझाव देते हैं। मैं इसे यहां ऐतिहासिक संदर्भ के लिए छोड़ रहा हूं।

स्वीकृत उत्तर में सुझाई गई तकनीक का उपयोग करें।

<?php 

    $shortCodes = array (
    'r' => 'ref', 
    't' => 'type' 
    ); 

    $expr = '#\{([a-z])\|([^|]+)\|([^}]+)\}#e'; 
    $replace = '"<a href=\"/{$shortCodes[\'$1\']}/$2\">$3</a>"'; 
    $string = 'Some text as a ref {r|link1.php|link} and a type {r|link2.php|link}'; 

    echo preg_replace($expr, $replace, $string); 
:


(पूरी तरह से वैध) के लिए वैकल्पिक preg_replace_callback() विधि @mario ने सुझाव दिया e संशोधक, जो केवल preg_replace() के साथ उपलब्ध है और अपने प्रतिस्थापन स्ट्रिंग PHP कोड के रूप में मूल्यांकन किया जा करने की अनुमति देता है

एकमात्र समस्या जो मैं सोच सकता हूं वह यह है कि यदि आपके LinkTitle में एक एकल उद्धरण है तो यह बच जाएगा और आउटपुट में \' के रूप में दिखाई देगा।

See it working

संपादित

एक छोटे से परीक्षण और त्रुटि के बाद, यहाँ एक संस्करण है कि कुछ भी साथ काम करता है आप इसे फेंक सकता है, और यह भी urlencode()/htmlspecialchars() जहां उचित माध्यम से सभी डेटा गुजरता है:

<?php 

    $shortCodes = array (
    'r' => 'ref', 
    't' => 'type' 
); 

    $expr = array(
    '#\{([a-z])\|([^|]+)\|([^}]*"[^}]*)\}#e', 
    '#\{([a-z])\|([^|]+)\|([^}]+)\}#e' 
); 
    $replace = array(
    '"<a href=\"/{$shortCodes[\'$1\']}/".htmlspecialchars(urlencode(\'$2\'))."\">".htmlspecialchars(str_replace(\'\"\', \'"\', \'$3\'))."</a>"', 
    '"<a href=\"/{$shortCodes[\'$1\']}/".htmlspecialchars(urlencode(\'$2\'))."\">".htmlspecialchars(\'$3\')."</a>"' 
); 
    $string = 'Some text as a ref {r|link &1.php|link&\' with some bad characters in it} and a type {r|link2.php|link with some "quotes" in it}'; 

    echo preg_replace($expr, $replace, $string); 

आउटपुट:

Some text as a ref <a href="/ref/link+%261.php">link&amp;' with some bad characters in it</a> and a type <a href="/ref/link2.php">link with some &quot;quotes&quot; in it</a>

See it working

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