2010-08-05 4 views
0

안녕하세요 저는 구문 분석되고 캐시 된 메타 데이터를보다 효율적으로 만들려합니다. 그래서 메타 코드를 객체 나 배열로 파싱 할 수 있어야합니다.preg_match를 사용하여 PHP에서 중첩 구조 구문 분석

Startidentifier : {

Endidentifier :}

당신은 점으로 객체를 탐색 할 수 있지만, 당신은 또한 산술/논리/관계형 작업을 수행 할 수 있습니다 (.). .

  • {mySelf.mother.job.jobName}

또는 중첩

  • {자신 {myObj로 : 여기

    은 메타 언어가 어떻게 생겼는지의 예입니다 . {keys [ "ObjProps"] [0]}. personAttribute.first} .size}

개 또는 함께 동작

  • obj.val * {(otherObj.intVal + myObj.longVal) == 1,200
  • }

이상의 논리

  • obj.condition == {! myObj.otherCondition}

여러분 대부분은 이미 내가 원하는 것을 이해했다고 생각합니다. 지금은 (중첩 및 2 개의 값만있는) 간단한 작업 만 할 수 있지만 동적 속성 이름으로 값을 가져 오는 중첩은 잘 작동합니다. 또한 텍스트 연결은 잘 작동합니다.

"Hello {myObj.name}! 어떻게 당신은 {myObj.type}입니까?"

같은 경우 (조건) 짧아 질 가능성이 있습니까? (true-case) : (false-case)는 좋을 것이지만, 나는 그 모든 것을 파싱하는 방법을 모른다. 나는 약간의 정규식을 가진 루프를 사용하고 있지만, 정규 표현식을 더 많이 사용하면 아마 더 빠르고 훨씬 더 유지 보수가 가능할 것이다.

누군가 내게 힌트를 주거나 나를 도울 수 있습니까? 어쩌면 프로젝트 사이트를 방문하여 내가 필요한 것을 이해할 수 있습니다 : http://sourceforge.net/projects/blazeframework/

미리 감사드립니다!

+0

regex에 대한 도움이 필요하면 원하는 변환의 유형에 대한 몇 가지 "이전"및 "이후"예제를 제공하십시오. (또는이 경우와 같이 [추출하려는 내용과 일치]) – zebediah49

+0

파서를 작성하는 것이 훨씬 낫습니다. 미리 정의 된 토큰에 매핑하는 문자열을 사용하고 이에 따라 행동하는 것이 좋습니다. 인터넷에서 '자신의 파서 작성'에 대한 충분한 사례. – Wrikken

+1

정말 디렉터리 구조를 변경해야합니다. 파서의 코드를 10 분 안에 찾을 수 없다면 끔찍할 것입니다. – NikiC

답변

1

정규 표현식을 사용하여 불확실한 수의 중괄호를 구문 분석하는 것은 간단합니다. 일반적으로 너무 많이 또는 너무 적게 일치하기 때문입니다.당신은 아마 중괄호에 맞게 \{.*\}를 먼저 떠오르는 정규 표현식을 사용하는 경우

, 당신은 하나의 일치를 얻을 것이다 : 예를 들어

, 같은 문자열에 입력에서 두 가지 예를 사용하는 Hello {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}?을 고려 {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}이를 기본적으로 정규 표현식은 이며 탐욕은이며 가능한 한 일치합니다.

거기에서 우리는 욕심없는 패턴 \{.*?\}을 사용할 수 있습니다.이 패턴은 여는 중괄호와 가능한 중괄호 사이에 가능한 한 일치하지 않습니다. 동일한 문자열을 사용하면이 패턴은 {myObj.name}{mySelf.{myObj.{keys["ObjProps"][0]}의 두 가지 일치 항목이됩니다. 분명히 두 번째 표현은 완전한 표현이 아니지만 욕심 거리지 않는 패턴은 가능한 한 일치하지 않으며 그 패턴을 충족시키는 가장 작은 일치입니다.

PCRE는 recursive regular expressions을 허용하지만, 그 경로를 내려 간다면 매우 복잡한 패턴으로 끝날 것입니다.

가장 좋은 해결책은 내 생각에 텍스트를 구문 분석 할 수있는 토큰 배열로 변환하는 토큰 라이저 (tokenizer)를 구성하는 것입니다.

+1

대단히 감사합니다! 나는 괄호를 발견하기 위해 재귀를 사용하는 정규식 기반의 토크 나이저를 사용하여 지금했다. 그런데 그 패턴은 그리 복잡하지는 않지만 재귀 적으로 모든 자식을 얻기 위해 메서드를 호출해야하지만 빠르고 빠르다 = D –

0

어쩌면 PREG_OFFSET_CAPTURE 플래그를 살펴보십시오!