PHP

2012-12-26 28 views
11

में '@' वर्ण के बाद शब्द की जांच करें, इस समय मैं एक समाचार और टिप्पणी प्रणाली बना रहा हूं, लेकिन मैं थोड़ी देर के लिए एक हिस्से में फंस गया हूं। मैं चाहता हूं कि उपयोगकर्ता @username जैसे ट्विटर शैली पर अन्य खिलाड़ियों को संदर्भित करने में सक्षम हों। सभी @ उपयोगकर्ता नाम के स्ट्रिंग में, शायद थोड़ी देर के साथ किया() के लिएPHP

$string = "I loved the article, @SantaClaus, thanks for writing!"; 
if($string contains @){ 
    $word = word after @; 
    $check = is word in database? ... 
} 

और वह, (3 नहीं असली पीएचपी, बस कल्पना पटकथा): स्क्रिप्ट कुछ इस तरह दिखेगा। मैं अटक गया हूँ, कृपया मदद करें।

+1

इस स्थिति में RegEx के साथ कुछ भी गलत नहीं है, तो आप [preg_match()] को जांचना चाहेंगे (http://php.net/man ual/en/function.preg-match.php) – Havelock

+1

अफवाह यह है कि लोग इसे कॉल करते हैं * छद्म कोड * – Alexander

+1

@Alexander - मैं इसे पसंद करता हूं। _ इमेजिनेशन स्क्रिप्टिंग._ "काम के लिए आप क्या करते हैं, एलेक्स?" "_Imagination scripting._" O_o ' –

उत्तर

15

यह वह जगह है जहां नियमित अभिव्यक्ति में आते हैं

<?php 
    $string = "I loved the article, @SantaClaus! And I agree, @Jesus!"; 
    if (preg_match_all('/(?<!\w)@(\w+)/', $string, $matches)) 
    { 
     $users = $matches[1]; 
     // $users should now contain array: ['SantaClaus', 'Jesus'] 
     foreach ($users as $user) 
     { 
      // check $user in database 
     } 
    } 
?> 
  1. / शुरुआत और अंत में परिसीमक हैं (अब इनके बारे में चिंता मत करो)।
  2. \w एक शब्द चरित्र, जो a-z, A-Z, 0-9, और _ शामिल के लिए खड़ा है।
  3. (?<!\w)@ थोड़ा उन्नत है, लेकिन यह एक नकारात्मक lookbehind अभिकथन, और इसका मतलब है, कहा जाता है "एक @ करता है कि नहीं एक शब्द चरित्र का पालन करें।" ऐसा इसलिए है कि आप ईमेल पते जैसी चीजें शामिल नहीं करते हैं।
  4. \w+ का अर्थ है, "एक या अधिक शब्द वर्ण।" + को क्वांटिफ़ायर के रूप में जाना जाता है।
  5. \w+पर कैप्चर किए गए भाग को कैप्चर किया गया है, और $matches में दिखाई देता है।

regular-expressions.info ट्यूटोरियल की लोकप्रिय पसंद प्रतीत होता है, लेकिन बहुत से अन्य ऑनलाइन हैं।

+0

+1 स्पष्टीकरण के लिए – m4t1t0

6

preg_replace_callback() के लिए एक नौकरी की तरह लग रहा:।

$string = preg_replace_callback('/@([a-z0-9_]+)/', function ($matches) { 
    if ($user = get_user_by_username(substr($matches[0], 1))) 
    return '<a href="user.php?user_id='.$user['user_id'].'">'.$user['name'].'</a>'; 
    else 
    return $matches[0]; 
}, $string); 
+1

+1 यह निश्चित रूप से काम करता है, लेकिन शायद नए डेवलपर्स को भ्रमित कर देगा। रखरखाव महत्वपूर्ण है। यह अस्पष्ट कार्यों के बिना और नियमित अभिव्यक्तियों के बिना किया जा सकता है। लेकिन एक में से 6, दूसरे दर्जन दर्जन। – DampeS8N

+1

मैं असहमत हूं। नियमित अभिव्यक्तियां और कार्य (यहां तक ​​कि अज्ञात) अस्पष्ट नहीं हैं।असल में मुझे यह स्पष्ट लगता है (क्योंकि * आपके इरादे से * इरादा * भाषा को जानता है जो तुरंत जानता है)। – AndreKR

+1

मेरी इच्छा है कि यह सच था कि भाषा को समझने वाले लोगों द्वारा अधिकांश कोड बनाए रखा गया था। आपको लगता है कि यह आपकी गलती नहीं है यदि आपके उत्तराधिकारी भाषा को नहीं जानते हैं, लेकिन इससे कोई फर्क नहीं पड़ता कि वे कोड को समझ सकते हैं या नहीं। लेकिन मैं सहमत हूं, हर किसी को इन चीजों को जानना चाहिए। – DampeS8N

3

अपने पाठ से उपयोगकर्ता नाम को पकड़ने के लिए ट्विटर एपीआई का उपयोग करने पर विचार करें: https://github.com/twitter/twitter-text-js

+0

शायद ओपी के लिए थोड़ा भारी है, लेकिन मौजूदा समाधान पर विचार करने के लिए +1। –

2

यहाँ एक अभिव्यक्ति है कि भरपाई कर देंगे कि तुम क्या जरूरत है, लेकिन ई-मेल पते पर कब्जा नहीं होगा:

$str = '@foo I loved the article, @SantaClaus, thanks for writing to [email protected]'; 
preg_match_all('/(^|[^a-z0-9_])(@[a-z0-9_]+)/i', $str, $matches); 
//$matches[2][0] => @foo 
///$matches[2][1] => @SantaClause 

के रूप में आप देख सकते हैं: [email protected] पर कब्जा नहीं किया गया है, लेकिन @foo और @SantaClaus स्ट्रिंग्स हैं ...