2013-06-27 3 views
6

मैं केवल खुद को सिखाने की कोशिश कर रहा हूं कि नियमित अभिव्यक्तियों का उपयोग कैसे करें, इसलिए क्षमा करें यदि यह कुछ के लिए तुच्छ लगता है।एक PHP रेगेक्स क्वेरी

मैं थोड़ा crib स्क्रिप्ट बना रहा हूं। यह कार्ड खेलने के मानक डेक का उपयोग करता है और मैं रैंक के लिए CDHS (क्लब, हीरे, दिल, हुकुम) और A2..9TJQK (ऐस, 2 ... 9, 10, जैक, रानी, ​​राजा) का उपयोग कर रहा हूं।

मेरे पास $hand है जो कार्ड की एक लंबाई की स्ट्रिंग है। उदाहरण के लिए, S2HA3D क्रमशः 2 हुकुम, दिल और 3 हीरे के 2 होंगे। ध्यान दें कि सूट और रैंक किसी भी तरह से गोल हो सकता है।

मैं उपयोग कर रहा हूँ:

preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i", $hand, $result); 

सभी कार्ड को खोजने के लिए, लेकिन यह सूट और रैंक रिटर्न पाया क्रम में।

मेरा प्रश्न यह है कि दिए गए आदेश के बावजूद, परिणाम प्रत्येक कार्ड के लिए रैंक को पहले कैसे दे सकता है। मुझे आशा है कि मैंने इसे स्पष्ट रूप से सुना है।

उत्तर

3

मुझे नहीं लगता कि आपको लगता है कि केवल preg_match के साथ कर सकते है।

यह फ़ंक्शन मिलान तारों के लिए है, में हेरफेर करें। हालांकि, आप एक दूसरे पास में एक preg_replace कर सकते हैं:

preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i", $hand, $rawResult); 
$normalisedResult = preg_replace('/([CDHS])([2-9ATJQK])/i', "$2$1", $rawResult[0]); 

मामले में आप आश्चर्य है, $1 और $2preg_replace() की पहली बहस में कोष्टक से पहचान समूहों के लिए backreferences हैं।

+0

मुझे लगता है कि यह वही करता है जो मैं सबसे संक्षिप्त रूप से चाहता हूं, चीयर्स! –

1

संपादित करें: मुझे पहले आपका प्रश्न ठीक से नहीं मिला। यहाँ आप आप 2 regex बनाने की जरूरत है क्या करने की जरूरत है, जैसे कुछ कहता है: एक चर जो कि 1 समूह मूल्य और 2 पकड़ कर सकते हैं बनाने के लिए

/([A2-9TJQK])([CDHS])/i 

कोशिश:

/([CDHS])([A2-9TJQK])/i 
तो

समूह मूल्य फिर सही रैंक प्राप्त करने के लिए आपको उन्हें दूसरे पैटर्न के साथ स्विच करने की आवश्यकता है ...

अगर मैं गलत हूं तो मुझे सही करें लेकिन आप इसे एक रेगेक्स के साथ नहीं कर सकते हैं।

+0

क्या वह पहले से ही कोशिश नहीं कर रहा है ... –

+0

कृपया अद्यतन उत्तर – SolidSnake

+0

देखें क्या गलत तरीके से घूमने वाले लोगों को पुन: व्यवस्थित करने के लिए preg_replace का उपयोग करने का कोई तरीका हो सकता है?मैंने http://stackoverflow.com/questions/8411407/looking-for-a-regex-to-find-and-reorder-a-string पर देखा और यह दिखाता है कि कुछ को फिर से व्यवस्थित किया जा सकता है। बस एक समान दृष्टिकोण था अगर बस आश्चर्य हुआ। –

0

मैं सभी जोड़ों से मेल खाने के लिए एक रेगेक्स का उपयोग करता हूं और उसके बाद ग्रेड को पहले स्थानांतरित करने के लिए कुछ तर्क देता हूं। यहाँ मैं क्या मतलब है (untested)

$grades = array(2,3,4,5,6,7,8,9,'A','T','J','Q','K'); 

preg_match_all('/((C|D|H|S)[2-9ATJQK]{1})|([2-9ATJQK]{1}(C|D|H|S))/i', $subject, $result, PREG_PATTERN_ORDER); 
for ($i = 0; $i < count($result[0]); $i++) { 

    if (in_array($result[0][$i][0], $grades)) { 
     echo ($result[0][$i]); 
    } 
    else { 
     echo (strrev($result[0][$i]));  
    } 

} 
3

एक तरह से जम्मू संशोधक है कि एक ही नाम का उपयोग करने की अनुमति देता है के साथ नामित किया गया कैप्चर उपयोग करने के लिए है।

$pattern = '~(?J)(?<rk>[2-9ATJQK])?(?<su>[CDHS])(?(1)|(?<rk>[2-9ATJQK]))~i'; 

preg_match_all($pattern, $hand, $matches, PREG_SET_ORDER); 

foreach($matches as $match) { 
    $result .= $match['rk'] . $match['su']; 
} 
echo $result; 

या एक preg_replace के साथ और अधिक सरल:

$result = preg_replace('~([2-9ATJQK])?([SCHD])(?(1)|([2-9ATJQK]))~i', '$2$1$3', $hand); 
संबंधित मुद्दे