Хотя у меня достаточно знаний о регулярном выражении в псевдокоде, мне трудно перевести то, что я хочу сделать в php regex perl.
Я пытаюсь использовать preg_match для извлечения части моего выражения.
У меня есть следующая строка ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
и мне нужно сделать 2 вещи:
PHP Regex preg_match extract
а. проверки синтаксиса
${classA.methodA.methodB(classB.methodC(classB.methodD)))}
действительный${classA.methodA.methodB}
действует${classA.methodA.methodB()}
не действует${methodB(methodC(classB.methodD)))}
не действует
b. Мне нужно извлечь эти данные ${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))
Очевидно Мне сложно извлечь повторяющиеся методы, и он не проверяет его должным образом (честно говоря, я оставил его для последнего раз, когда я решил другую проблему), поэтому допустимы пустые круглые скобки, и он не проверяет, не открывается ли это после того, как открыта скобка должны быть закрыты.
Спасибо всем
UPDATE
X m.buettner
спасибо за вашу помощь. Я быстро попробовал свой код, но он дает очень маленькую проблему, хотя я могу ее передать. Вопрос тот же одной из моих предыдущих кодов, которые я не отправлял здесь, который, когда я попробовать эту строку:
$expression = '${myvalue.fdsfs}';
с определением шаблона показывает:
found
0 ${myvalue.fdsfs}
1 myvalue.fdsfs
2 myvalue
3
4 fdsfs
Как вы можете см. третью строку выхватывается как пробел, которого нет. Я не мог понять, почему это так, так что вы можете предложить мне, как мне или мне нужно жить с ним из-за ограничений регулярного выражения php?
Это говорит, что я просто могу сказать вам спасибо. Вы не только ответили на мою проблему, но и попытались ввести как можно больше информации со многими предложениями о правильном пути следования при разработке шаблонов.
Одна последняя вещь я (глупый) забыл добавить один маленький важный случай, который несколько параметров, разделенные запятой, так
$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';
X Казимир и Ипполит
Ваше предложение также хорошо, но это означает, немного сложной ситуации, когда с помощью этого кода. Я имею в виду, что сам код легко понять, но он становится менее гибким. Это сказало, что это также дало мне много информации, которая, безусловно, может быть полезной в будущем.
X Denomales
Спасибо за вашу поддержку, но ваш код падает, когда я пытаюсь это:
$sourcestring='${classA1.methodA0.methodA1.methodB1(classB.methodC(classB.methodD))}';
результат:
Array
( [0] => Массив ( [0] => $ {classA1.methodA0.methodA1.methodB1 (классB.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 Тогда что? Вы получаете имя класса, промежуточные методы и окончательный метод без аргументов. Разве это не ваше намерение? –