2016-04-15 10 views
5

मैं निम्नलिखितPHP में यह अजीब स्ट्रिंग विस्फोट कैसे करें?

DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string] 

ऊपर स्ट्रिंग की तरह एक स्ट्रिंग एक तरह समूहों में स्वरूपित की तरह दिखता है निम्नलिखित:

A-B[C]-D-E-[F]-G-[H] 

लगता है कि मैं उन लोगों में से कुछ कार्रवाई करने के लिए की तरह है कि है समूह, और मैं विस्फोट की तरह कुछ बनाना पसंद है।

मैं की तरह कहते हैं, क्योंकि मैं इस कोड की कोशिश की है:

$string = 'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]'; 
$parts = explode('-', $string); 
print_r($parts); 

और मैं निम्नलिखित परिणाम प्राप्त:

Array 
(
    [0] => DAS 
    [1] => 1111[DR 
    [2] => Helpfull 
    [3] => R] 
    [4] => RUN 
    [5] => 
    [6] => [121668688374] 
    [7] => N 
    [8] => [+helpfull_+string] 
) 

है कि यह मैं क्या जरूरत नहीं है।

Array 
(
    [0] => DAS 
    [1] => 1111[DR-Helpfull-R] 
    [2] => RUN 
    [3] => 
    [4] => [121668688374] 
    [5] => N 
    [6] => [+helpfull_+string] 
) 

किसी तरह से मैं यह की जरूरत है इस स्ट्रिंग विस्फोट के लिए एक अच्छा और सुरुचिपूर्ण तरीका सुझाव है कि कृपया कर सकते हैं:

क्या मैं जरूरत निम्नलिखित उत्पादन है?

जो मैं उल्लेख करना भूल गया था, यह है कि स्ट्रिंग में कम या कम समूह हो सकते हैं। उदाहरण:

DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string] 
DAS-1111[DR-Helpfull-R]-RUN--[121668688374] 
DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]-anotherPart 

अद्यतन 1

@axiac से उल्लेख किया है, preg_split काम कर सकते हैं। लेकिन क्या आप कृपया रेगेक्स के साथ मदद कर सकते हैं?

मैं यह कोशिश की है लेकिन ऐसा लगता है कि यह गलत है:

(?!\]\-)\-

+1

यह के लिए एक नौकरी की तरह लग रहा [ 'preg_split()'] (http://php.net/manual/en/function.preg-split.php)। – axiac

+0

निश्चित लंबाई समूहों से बना स्ट्रिंग है? इस प्रकार, क्या पहला कॉलम (आपके उदाहरण में डीएएस) हमेशा पहले तीन अक्षर होगा? क्या दूसरे 18 अक्षर आदि होंगे? –

+0

@axiac Mmm मुझे यह फ़ंक्शन नहीं पता था। मैं फिर से कोशिश करने और वापस आने जा रहा हूं :) –

उत्तर

5

कोड:

$str = 'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]'; 
$re = '/([^-[]*(?:\[[^\]]*\])?[^-]*)-?/'; 

$matches = array(); 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); 

इसका उत्पादन:

Array 
(
    [0] => DAS 
    [1] => 1111[DR-Helpfull-R] 
    [2] => RUN 
    [3] => 
    [4] => [121668688374] 
    [5] => N 
    [6] => [+helpfull_+string] 
    [7] => 
) 

उत्पादन में स्थिति 7 में एक अतिरिक्त रिक्त मान नहीं है। यह regex के अंत में शून्य-या-दोहराव क्वांटिफ़ायर (?) के कारण दिखाई देता है। क्वांटिफायर की आवश्यकता होती है क्योंकि इसके बिना अंतिम टुकड़ा (सूचकांक 6 पर) मेल नहीं खाता है।

अंतिम - के बाद आप ? को हटा सकते हैं और इस तरह से पूछें कि डैश (-) हमेशा मेल खाता है।इस मामले में आपको अपनी इनपुट स्ट्रिंग में अतिरिक्त - जोड़ना होगा।

regex

(    # start of the 1st subpattern 
       # the captured value is returned in $matches[1] 
    [^-[]*  # match any character but '-' and '[', zero or more times 
    (?:   # start of a non-capturing subpattern 
    \[   # match an opening square bracket ('[') 
    [^\]]*  # match any character but ']', zero or more times 
    \]   # match a closing square bracket (']') 
)?   # end of the subpattern; it is optional (can appear 0 or 1 times) 
    [^-]*  # match any character but '-', zero or more times 
)    # end of the 1st subpattern 
-?    # match an optional dash ('-') 
2
इसके बजाय आप निम्नलिखित पैटर्न से मेल करने के लिए प्रयास करना चाहिए विस्फोट के

:

(?:^|-)([^-\[]*(?:\[[^\]]+\])?) 

Here is an example:

$regex = '/(?:^|-)([^-\[]*(?:\[[^\]]+\])?)/'; 
$tests = array(
    'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]', 
    'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]', 
    'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]-anotherPart' 
); 
foreach ($tests as $test) { 
    preg_match_all($regex, $test, $result); 
    print_r($result[1]); 
} 

आउटपुट:

// DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string] 
Array 
(
    [0] => DAS 
    [1] => 1111[DR-Helpfull-R] 
    [2] => RUN 
    [3] => 
    [4] => [121668688374] 
    [5] => N 
    [6] => [+helpfull_+string] 
) 

// DAS-1111[DR-Helpfull-R]-RUN--[121668688374] 
Array 
(
    [0] => DAS 
    [1] => 1111[DR-Helpfull-R] 
    [2] => RUN 
    [3] => 
    [4] => [121668688374] 
) 

// DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]-anotherPart 
Array 
(
    [0] => DAS 
    [1] => 1111[DR-Helpfull-R] 
    [2] => RUN 
    [3] => 
    [4] => [121668688374] 
    [5] => N 
    [6] => [+helpfull_+string] 
    [7] => anotherPart 
) 
+0

मैंने 'preg_match' और' preg_split' दोनों का उपयोग करके अपना पैटर्न उपयोग किया लेकिन कोई भी काम नहीं करता है: (वैसे भी, आपकी कोशिश के लिए धन्यवाद :) –

+1

@MerianosNikos मेरा PHP थोड़ा जंगली है। मैं कुछ और परीक्षण के बाद जवाब संशोधित कर दूंगा। –

+0

मेरी मशीन पर चेक किया गया .. पूरी तरह से काम कर रहा है ... https://3v4l.org/aNnoU –

1

इस मामले (*SKIP)(*FAIL) विधि के लिए एकदम सही है। आप अपनी स्ट्रिंग को हाइफ़न पर विभाजित करना चाहते हैं, जब तक वे स्क्वायर ब्रैकेट के अंदर न हों।

आसान। बस इतना की तरह सीमांकक के रूप में इन हाइफ़न को अयोग्य घोषित:

पैटर्न: ~\[[^]]+\](*SKIP)(*FAIL)|-~ (Pattern Demo)

कोड: (Demo)

$strings=['DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]', 
      'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]', 
      'DAS-1111[DR-Helpfull-R]-RUN--[121668688374]-N-[+helpfull_+string]-anotherPart']; 

foreach($strings as $string){ 
    var_export(preg_split('~\[[^]]+\](*SKIP)(*FAIL)|-~',$string)); 
    echo "\n\n"; 
} 

आउटपुट:

array (
    0 => 'DAS', 
    1 => '1111[DR-Helpfull-R]', 
    2 => 'RUN', 
    3 => '', 
    4 => '[121668688374]', 
    5 => 'N', 
    6 => '[+helpfull_+string]', 
) 

array (
    0 => 'DAS', 
    1 => '1111[DR-Helpfull-R]', 
    2 => 'RUN', 
    3 => '', 
    4 => '[121668688374]', 
) 

array (
    0 => 'DAS', 
    1 => '1111[DR-Helpfull-R]', 
    2 => 'RUN', 
    3 => '', 
    4 => '[121668688374]', 
    5 => 'N', 
    6 => '[+helpfull_+string]', 
    7 => 'anotherPart', 
) 
संबंधित मुद्दे