Chociaż mam wystarczającą znajomość regex w pseudocode, mam problem z tłumaczeniem tego, co chcę zrobić w php regex perl.
Próbuję użyć preg_match, aby wyodrębnić część mojego wyrażenia.
Mam następujący ciąg ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
i muszę zrobić 2 rzeczy:
PHP Regex preg_match extract
a. sprawdzić poprawność składni
${classA.methodA.methodB(classB.methodC(classB.methodD)))}
ważny${classA.methodA.methodB}
ważny${classA.methodA.methodB()}
nie ważne${methodB(methodC(classB.methodD)))}
nie ważne
b. I trzeba wyodrębnić te informacje ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
powinien powrócić
1. ClassA
2. metodaA
3. metodaB (classB.methodC (classB.methodD)))
Utworzyłem ten kod
$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/>';
}
wynikiem jest:
znaleźć
0 $ {myvalue.fdsfs.fsdf.blo (fsdf.fsfds (fsfs.fs))}
1 myvalue
2 fsdf
3 blO (fsdf.fsfds (fsfs.fs))
Oczywiście Mam trudności z wyodrębnieniem powtarzających się metod i nie jest to prawidłowe sprawdzanie poprawności (szczerze mówiąc zostawiłem to na końcu, gdy rozwiążę inny problem), więc puste nawiasy są dozwolone i nie sprawdza, czy po otwarciu nawiasu jest to musi być zamknięty.
Dzięki wszystkim
UPDATE
X m.buettner
dziękuję za pomoc. Zrobiłem szybką próbę twojego kodu, ale daje to bardzo mały problem, chociaż mogę go przekazać. Kwestia jest taka sama od jednej z moich wcześniejszych kodów, że nie mogę pisać tutaj który jest, gdy próbuję ten ciąg:
$expression = '${myvalue.fdsfs}';
z definicji wzorca to pokazuje:
found
0 ${myvalue.fdsfs}
1 myvalue.fdsfs
2 myvalue
3
4 fdsfs
jak można patrz trzecia linia jest catched jako biała przestrzeń, która nie jest obecna. Nie mogłem zrozumieć, dlaczego tak się dzieje, więc czy możesz mi zasugerować, jak mam z nim żyć, z powodu ograniczeń php regex?
To powiedziawszy, mogę ci tylko podziękować. Nie tylko odpowiedziałeś na mój problem, ale także próbowałeś podać jak najwięcej informacji, z wieloma sugestiami na temat prawidłowej ścieżki postępowania przy opracowywaniu wzorców.
Ostatnią rzeczą I (głupi) zapomniał dodać jeden mały ważną sprawę, która jest wiele parametrów podzielonych przecinkami więc
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB)}';
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB,classD.mehtodDA)}';
musi być ważny.
edytowany do tego
$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';
X Kazimierz Hippolyte et
Twoja sugestia też jest dobre, ale to wiąże się z małą złożonej sytuacji, gdy za pomocą tego kodu. Chodzi o to, że sam kod jest łatwy do zrozumienia, ale staje się mniej elastyczny. To powiedziało, że dostarczyło mi również wiele informacji, które z pewnością mogą być pomocne w przyszłości.
X Denomales
Dzięki za wsparcie, ale kod spada, gdy próbuję to:
$sourcestring='${classA1.methodA0.methodA1.methodB1(classB.methodC(classB.methodD))}';
wynik jest:
Array
( [0] => Array ( [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))
)
)
Należy
[2] => Array
(
[0] => methodA0.methodA1
)
[3] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
lub
[2] => Array
(
[0] => methodA0
)
[3] => Array
(
[0] => methodA1
)
[4] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
Kiedy próbuję tego wyrażenia $ expression = '$ {myvalue.fdsfs} "; – user2463968
@ user2463968 Co wtedy? Otrzymasz nazwę klasy, żadnych pośrednich metod i ostateczną metodę bez argumentów. Czy to nie twoja intencja? –