2010-11-30 12 views
10

मेरे पास संख्याओं और कभी-कभी अक्षरों द्वारा बनाई गई स्ट्रिंग है।एक स्ट्रिंग के संख्यात्मक भाग को एक से बढ़ाएं कैसे?

उदाहरण AF-1234 या 345ww

मुझे संख्यात्मक हिस्सा प्राप्त करना है और इसे एक से बढ़ा देना है।
मैं यह कैसे कर सकता हूं? शायद regex के साथ?

उत्तर

25

आप के रूप preg_replace_callback उपयोग कर सकते हैं:

function inc($matches) { 
    return ++$matches[1]; 
} 

$input = preg_replace_callback("|(\d+)|", "inc", $input); 

मूल रूप से आप स्ट्रिंग regex \d+ का उपयोग कर के संख्यात्मक भाग से मेल और कॉलबैक फ़ंक्शन जो वृद्धि की जाती मान देता है द्वारा दिए गए मान से बदल दें।

$input = preg_replace("|(\d+)|e", "$1+1", $input); 

Ideone link

+0

+1 मैं इस एक पसंद करते हैं। –

+0

क्या होगा यदि मेरे पास "XXX -342" की तरह स्ट्रिंग है? यह $ मैचों [0] या $ मैचों [1] में होगा? – tampe125

+3

@ कोडडिक्ट: क्या आपको नहीं लगता कि कॉलबैक एक "छोटा" ओवरहेड है? नियमित '+ 1' का उपयोग क्यों न करें? – zerkms

0

यहाँ कुछ अजगर कोड करता है कि आप क्या पूछना है:

Ideone link

वैकल्पिक रूप से इस रूप में e संशोधक के साथ preg_replace() का उपयोग किया जा सकता है। मेरे PHP पर बहुत अच्छा नहीं है, लेकिन मैं देखूंगा कि मैं इसे आपके लिए परिवर्तित कर सकता हूं या नहीं।

>>> import re 
>>> match = re.match(r'(\D*)(\d+)(\D*)', 'AF-1234') 
>>> match.group(1) + str(int(match.group(2))+1) + match.group(3) 
'AF-1235' 
+0

अन्य ने पहले ही PHP में उत्तर दिया है। अगर किसी को यह उपयोगी लगता है तो मैं इसे यहां छोड़ दूंगा। – marcog

2

स्ट्रिंग संख्यात्मक वर्ण के साथ समाप्त होता अगर यह इस सरल है ...

$str = 'AF-1234'; 
echo $str++; //AF-1235 

दैट '345ww' के साथ उसी तरह काम करता है, हालांकि परिणाम नहीं हो सकता है कि तुम क्या उम्मीद करते हैं।

$str = '345ww'; 
echo $str++; //345wx 

@ tampe125

यह उदाहरण शायद स्ट्रिंग है कि संख्या के साथ समाप्त incrementing अगर अपनी आवश्यकताओं के लिए सबसे अच्छा तरीका है।

$str = 'XXX-342'; 
echo $str++; //XXX-343 
3

यहाँ एक उदाहरण है कि मूल्य पर एक पूर्व वेतन वृद्धि करके मेरे लिए काम किया है

$admNo = HF0001; 
$newAdmNo = ++$admNo; 

ऊपर कोड इच्छा उत्पादन HF0002

0

आप तार से अधिक संख्या है के साथ काम कर रहे हैं, तो तब भागों को रेगेक्स के साथ हल करना इतना आसान नहीं है, क्योंकि आपके पास संख्याएं एक संख्यात्मक भाग से दूसरी संख्या में बहती जा सकती हैं।

उदाहरण के लिए यदि आपके पास INV00-10-99 है जो INV00-11-00 तक बढ़ाना चाहिए।

मैं निम्नलिखित के साथ समाप्त हो गया:

for ($i = strlen($string) - 1; $i >= 0; $i--) { 
    if (is_numeric($string[$i])) { 
    $most_significant_number = $i; 
    if ($string[$i] < 9) { 
     $string[$i] = $string[$i] + 1; 
     break; 
    } 
    // The number was a 9, set it to zero and continue. 
    $string[$i] = 0; 
    } 
} 

// If the most significant number was set to a zero it has overflowed so we 
// need to prefix it with a '1'. 
if ($string[$most_significant_number] === '0') { 
    $string = substr_replace($string, '1', $most_significant_number, 0); 
} 
संबंधित मुद्दे