2013-08-20 2 views
2

를 호출하는 문제입니다 :정규 표현식은 다음

"<p>The price for vehicles {capitalize(pluralize(vehicle))} is {format_number(value, language)}</p><span>{employee_name}</span><span>\{do not parse me}</span>" 

같은 문자열 주어진 나는 중괄호의 이스케이프 쌍 사이의 모든 값을 일치 PHP (1) 정규식 패턴이 필요 및 (2) 함수 호출과 중첩 함수 일치 다른 정규식 패턴 (제 1 패턴이 일치되면) 부른다. 물론, 만약 내가 두 작업에 대해서만 끝내 줄 수있는 하나의 정규식을 사용할 수 있습니다.

그런데, 나는 Smarty, Twig 또는 다른 라이브러리를 사용할 수 없습니다. 이것이 내가 직접 구문 분석 메커니즘을 구축해야하는 유일한 이유입니다.

감사합니다.

해결책 (1) 첫 번째 문제에 대한 부분적인 해결책은 here입니다. 기본적으로 정규식

(?={((?:[^{}]++|{(?1)})++)})
을 사용하고 결과 배열의 인덱스 1에서 일치하는 항목을 찾습니다.

나는 여전히 중괄호를 이스케이프하는 방법을 찾아야하기 때문에 부분적입니다.

(2) Mario가 제안한 재귀 적 정규식의 사용을 고려하고 있습니다. 여기에 결과를 게시합니다.

감사합니다. 은 "응답되지 않은"필터에서이 문제를 제거하기 위해 의견에서 답을 복사

+0

제 정규식은 간단하지만, 두번째는 PHP를 사용하여 수행 될 수 없다. 대신 파서를 사용해야합니다. –

+0

정규식은 중첩/재귀 구조를 구문 분석하는 데 적합하지 않습니다. –

+1

이스케이프 처리 된 곱슬과''(? R)'재귀 적 정규 표현식] (http://php.net/manual/en/regexp.)을 피하기 위해 부정적인 lookbehind'(? mario

답변

1

:

(?<!\\){([^(){}]+)\(((?:[^(){}]+|\(((?2))\))*)\)} 

링크 : http://www.regex101.com/r/uI4qN0

이 나타납니다

당신이 찾고있는 것은 무엇

~ 대답마다 Jerry

참고 : 이스케이프 처리 된 중괄호를 무시하면됩니다. 그래서 같은 식의 시작에 부정적 예측 (?<!\\)를 추가을 hed :

(?<!\\)(?={((?:[^{}]++|{(?1)})++)})