2010-11-25 14 views
9

के साथ ट्विटर हैशटैग को सशर्त रूप से बदलने के लिए रेगेक्स मैं उपयोगकर्ता फ़ीड से नवीनतम आधा दर्जन ट्विटर स्थिति अपडेट प्राप्त करने और उन्हें वेबपृष्ठ पर प्रदर्शित करने के लिए प्रारूपित करने के लिए एक छोटी PHP स्क्रिप्ट लिख रहा हूं। इस के हिस्से के रूप में मुझे हैशटैग को फिर से लिखने के लिए regex की आवश्यकता है search.twitter.com पर हाइपरलिंक्स के रूप में। शुरू में मैं का उपयोग करने की कोशिश की:हाइपरलिंक

<?php 
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet); 
?> 

(https://gist.github.com/445729 से लिया गया)

परीक्षण के दौरान मुझे पता चला कि #test ट्विटर वेबसाइट पर एक लिंक में बदल जाता है, तथापि # 123 नहीं है। इंटरनेट पर कुछ जांच करने और विभिन्न टैग के साथ खेलने के बाद मैं इस निष्कर्ष पर पहुंचा कि एक हैशटैग में एक लिंक बनाने के लिए कहीं भी वर्णमाला वर्ण या अंडरस्कोर होना चाहिए; केवल संख्यात्मक वर्णों वाले टैगों को अनदेखा किया जाता है (संभावित रूप से "अच्छी प्रस्तुति बॉब, स्लाइड # 3 मेरी पसंदीदा थी!" जैसी चीजों को रोकने के लिए)। यह उपर्युक्त कोड गलत बनाता है, क्योंकि यह खुशी से # 123 को एक लिंक में परिवर्तित कर देगा।

मैं नहीं, एक समय में बहुत regex किया है तो मेरे rustyness में मैं निम्नलिखित पीएचपी समाधान के साथ आया था:

<?php 
$test = 'This is a test tweet to see if #123 and #4 are not encoded but #test, #l33t and #8oo8s are.'; 

// Get all hashtags out into an array 
if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) { 
    foreach ($arrHashtags[2] as $strHashtag) { 
    // Check each tag to see if there are letters or an underscore in there somewhere 
    if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) { 
     $test = str_replace($strHashtag, '<a href="http://search.twitter.com/search?q=%23'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test); 
    } 
    } 
} 

echo $test; 
?> 

यह काम करता है; लेकिन ऐसा लगता है कि यह क्या करता है इसके लिए काफी लंबा हवादार लगता है। मेरा सवाल यह है कि, क्या मैं एक gg.github से प्राप्त एक जैसा preg_replace है जो सशर्त रूप से हैशटैग को हाइपरलिंक्स में फिर से लिख देगा, अगर उनमें केवल संख्याएं न हों?

उत्तर

23
(^|\s)#(\w*[a-zA-Z_]+\w*) 

पीएचपी

$strTweet = preg_replace('/(^|\s)#(\w*[a-zA-Z_]+\w*)/', '\1#<a href="http://twitter.com/search?q=%23\2">\2</a>', $strTweet); 

यह नियमित अभिव्यक्ति का कहना है एक # 0 या अधिक वर्ण [a-zA-Z0-9_] के बाद, एक अक्षरात्मक चरित्र या अंडरस्कोर (1 या अधिक) के बाद , 0 या अधिक शब्द वर्णों के बाद।

http://rubular.com/r/opNX6qC4sG < - यहां परीक्षण करें।

+0

आह, सही! और उल्लेखनीय रूप से सरल भी ... मेरा दिमाग आज ठीक से नहीं है। : पी बहुत धन्यवाद! – foxsoup

+0

क्या यह विशेष पात्रों, @ गज़लर को ध्यान में रखता है? कहो क्या यह # प्रावधान जैसे शब्दों को ले जाएगा? – Jeremy

+0

@ जेरेमी नहीं, लेकिन यह चाल '(^ | \ s) # (\ w * [\ S! #] + \ W *) ' –

0

मैं इस तैयार किया है: /(^|\s)#([[:alnum:]])+/gi

1

यह वास्तव में अक्षर हैं जो अन्यथा टैग "# Trentemoller" अभ्यस्त काम की तरह एक हैशटैग में अनुमति नहीं है के लिए खोज करने के लिए बेहतर है।

मेरे लिए

अच्छी तरह से काम करता है निम्नलिखित ...

preg_match('/([ ,.]+)/', $string, $matches); 
0

मैं हालांकि regex हैशटैग की शुरुआत में एक रिक्त स्थान कहा, काम करने के लिए Gazlers answer पाया, तो मैं पहले भाग हटाया:

(^|\s) 

यह अब मेरे लिए पूरी तरह से काम करता है:

#(\w*[a-zA-Z_0-9]+\w*) 

Exa यहां पर: http://rubular.com/r/dS2QYZP45n

+0

आपकी संशोधित अभिव्यक्ति '# (\ w * \ w + \ w *) 'जैसी नहीं है? –

+0

किसी भी तरह से, गैज़लर का उत्तर काम करता है, यह वास्तव में हैशटैग की शुरुआत में एक रिक्त स्थान नहीं जोड़ता है, बल्कि यह दो समूहों को कैप्चर करता है, लेकिन आप केवल दूसरे समूह को चाहते हैं। –

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