हालांकि मेरे पास छद्म कोड में रेगेक्स का पर्याप्त ज्ञान है, लेकिन मुझे php regex perl में जो करना है, उसका अनुवाद करने में समस्या हो रही है।
मैं अपनी अभिव्यक्ति के हिस्से को निकालने के लिए preg_match का उपयोग करने की कोशिश कर रहा हूं।
मैं निम्न स्ट्रिंग ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
है और मैं 2 काम करने होंगे:
PHP Regex preg_match निष्कर्षण
एक। वाक्य रचना
${classA.methodA.methodB(classB.methodC(classB.methodD)))}
वैध मान्य${classA.methodA.methodB}
वैध${classA.methodA.methodB()}
मान्य नहीं${methodB(methodC(classB.methodD)))}
मान्य नहीं
बी। मैं उन जानकारी ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
निकालने के लिए की जरूरत लौटना चाहिए
1. ClassA
2. MethodA
3. methodB (classB.methodC (classB.methodD)))
मेरे द्वारा बनाए गए इस कोड को
$expression = '${myvalue.fdsfs.fsdf.blo(fsdf.fsfds(fsfs.fs))}';
$pattern = '/\$\{(?:([a-zA-Z0-9]+)\.)(?:([a-zA-Z\d]+)\.)*([a-zA-Z\d.()]+)\}/';
if(preg_match($pattern, $expression, $matches))
{
echo 'found'.'<br/>';
for($i = 0; $i < count($matches); $i++)
echo $i." ".$matches[$i].'<br/>';
}
परिणाम है:
पाया
0 $ {myvalue.fdsfs.fsdf.blo (fsdf.fsfds (fsfs.fs))}
1 myvalue
2 fsdf
3 blo (fsdf.fsfds (fsfs.fs))
जाहिर है मुझे दोहराव के तरीकों को निकालने में मुश्किल हो रही है और यह ठीक से इसे मान्य नहीं कर रहा है (ईमानदारी से मैंने दूसरी समस्या को हल करने के बाद इसे आखिरी बार छोड़ दिया) इसलिए खाली कोष्ठक की अनुमति है और यह जांच नहीं कर रहा है कि एक बार ब्रांड्स को खोला जाए या नहीं बंद होना चाहिए।
धन्यवाद सभी
अद्यतन
एक्स m.buettner
आपकी मदद के लिए धन्यवाद। मैंने आपके कोड की तेज़ कोशिश की लेकिन यह एक बहुत ही छोटा मुद्दा देता है, हालांकि मैं इसे पास कर सकता हूं। अपने पैटर्न परिभाषा के साथ
$expression = '${myvalue.fdsfs}';
यह पता चलता है: मुद्दा मेरे पहले कोड में से एक का एक ही है कि मैं यहाँ पोस्ट नहीं जो है जब मैं इस स्ट्रिंग की कोशिश है
found
0 ${myvalue.fdsfs}
1 myvalue.fdsfs
2 myvalue
3
4 fdsfs
आप कर सकते हैं के रूप में देखें कि तीसरी रेखा को एक सफेद जगह के रूप में पकड़ा गया है जो मौजूद नहीं है। मुझे समझ में नहीं आया कि यह ऐसा क्यों कर रहा था, तो क्या आप मुझे सुझाव दे सकते हैं कि php regex सीमाओं के कारण मुझे इसके साथ कैसे रहना है या नहीं?
मैंने कहा कि मैं आपको धन्यवाद दे सकता हूं। न केवल आपने मेरी समस्या का उत्तर दिया बल्कि पैटर्न विकसित करते समय पालन करने के लिए उचित मार्ग पर कई सुझावों के साथ जितना संभव हो उतना जानकारी इनपुट करने की कोशिश की।
एक आखिरी बात मैं (बेवकूफ) एक छोटे से महत्वपूर्ण मामला है जिसमें एक अल्पविराम से विभाजित तो
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB)}';
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB,classD.mehtodDA)}';
मान्य होना चाहिए से अधिक पैरामीटर है जोड़ने के लिए भूल गया था।
मैं इस
$expressionPattern =
'/
^ # beginning of the string
[$][{] # literal ${
( # group 1, used for recursion
( # group 2 (class name)
[a-z\d]+ # one or more alphanumeric characters
) # end of group 2 (class name)
[.] # literal .
( # group 3 (all intermediate method names)
(?: # non-capturing group that matches a single method name
[a-z\d]+ # one or more alphanumeric characters
[.] # literal .
)* # end of method name, repeat 0 or more times
) # end of group 3 (intermediate method names);
( # group 4 (final method name and arguments)
[a-z\d]+ # one or or more alphanumeric characters
(?: # non-capturing group for arguments
[(] # literal (
(?1) # recursively apply the pattern inside group 1
(?: # non-capturing group for multiple arguments
[,] # literal ,
(?1) # recursively apply the pattern inside group 1 on parameters
)* # end of multiple arguments group; repeat 0 or more times
[)] # literal)
)? # end of argument-group; make optional
) # end of group 4 (method name and arguments)
) # end of group 1 (recursion group)
[}] # literal }
$ # end of the string
/ix';
एक्स कासिमिर एट Hippolyte
आपके सुझाव को संपादित भी अच्छा है, लेकिन जब इस कोड का उपयोग यह थोड़ा जटिल स्थिति का तात्पर्य। मेरा मतलब है कि कोड स्वयं समझना आसान है लेकिन यह कम लचीला हो जाता है। उस ने कहा कि उसने मुझे बहुत सारी जानकारी भी दी है जो भविष्य में निश्चित रूप से सहायक हो सकती है।
एक्स Denomales
अपने समर्थन के लिए धन्यवाद, लेकिन अपने कोड गिर जाता है जब मैं इस प्रयास करें:
$sourcestring='${classA1.methodA0.methodA1.methodB1(classB.methodC(classB.methodD))}';
परिणाम है:
Array
( [0] => ऐरे ( [0] => $ {classA1.methodA0.methodA1.methodB1 (classB.methodC (cl assB.methodD))} )
[1] => Array
(
[0] => classA1
)
[2] => Array
(
[0] => methodA0
)
[3] => Array
(
[0] => methodA1.methodB1(classB.methodC(classB.methodD))
)
)
यह
[2] => Array
(
[0] => methodA0.methodA1
)
[3] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
या
[2] => Array
(
[0] => methodA0
)
[3] => Array
(
[0] => methodA1
)
[4] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
जब मैं इस $ अभिव्यक्ति = '$ {myvalue.fdsfs}' को आजमाता हूं; – user2463968
@ user2463968 फिर क्या? आपको तर्क के बिना कक्षा का नाम, कोई मध्यवर्ती विधियां और अंतिम विधि नहीं मिलती है। क्या यह आपका इरादा नहीं है? –