2011-06-27 12 views
5

मैं php के preg_replace() का उपयोग किसी भी शब्द को परिवर्तित करने के लिए कर रहा हूं जिसमें उनके सामने हैशटैग प्रतीक है।हैशटैग टेक्स्ट को हैशटैग हाइपरलिंक में कैसे परिवर्तित करें?

तो जैसे कुछ: #austin बन जाएगा: <a href="/tag/austin">#austin</a>

यहाँ मेरी नियमित अभिव्यक्ति है।

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', $text);

मेरे मुद्दा है: अगर कोई कैपिटल अक्षरों में कर रहे हैं, href मूल्य उन्हें रख सकेंगे, लेकिन मैं href मूल्य हमेशा पूरी तरह लोअरकेस होना चाहता हूँ।

इनपुट: #Austin
नहीं बन चाहिए: <a href="/tag/Austin">#Austin</a>
यह हो जाना चाहिए: <a href="/tag/austin">#Austin</a>

मैं इन परिणामों को बनाने के लिए मेरे रेगुलर एक्सप्रेशन को कैसे संशोधित कर सकता है?

उत्तर

5

यहाँ preg_replace_callback का उपयोग कर एक उदाहरण है के रूप में @faileN ने सुझाव दिया:

Demo Link

$string = '#Austin'; 

function hashtag_to_link($matches) 
{ 
    return '<a href="/tag/' . strtolower($matches[1]) . '">' . $matches[0] . '</a>'; 
} 

echo preg_replace_callback('/\B#(\w*[a-z_]+\w*)/i', 'hashtag_to_link', $string); 

// output: <a href="/tag/austin">#Austin</a> 
3

इस प्रयास करें:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/', '<a href="/tag/$1">$0</a>', strtolower($text)); 

कि विषय ($text) से पहले regex परीक्षण किया जाता है छोटे अक्षरों में होना करने के लिए बाध्य करेगा।

+0

लेकिन लिंक का टेक्स्ट भी लोअरकेस होगा। –

+0

ऐसा लगता है कि ओपी क्या चाहता है। –

+0

क्षमा करें मैंने निर्दिष्ट नहीं किया है, मैं चाहता हूं कि असल में शब्द समान रहें .. इसलिए # ऑस्टिन '#Autsin' – floatleft

1

सिद्धांत आप e संशोधक की सहायता से आप प्रतिस्थापन स्ट्रिंग में पीएचपी कार्यों का उपयोग उपयोग कर सकते हैं:

preg_replace('/\B#(\w*[A-Za-z_]+\w*)/e', "'<a href=\"/tag/'.strtolower('$1').'\">$0</a>'", $text); 
+0

होगा यह विधि [PHP5.5 से हटा दी गई है और PHP7 से हटा दी गई है) (http: // php। नेट/मैनुअल/एन/context.pcre.pattern.modifiers.php) (लेकिन तर्क अच्छा है) – mickmackusa

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