2012-11-20 5 views
0

정규식을 사용하여 일부 입력을 구문 분석하려고합니다. 입력 형식이 될 것이다템플릿을 구문 분석하는 REGEX

someValue와 {3}

목적은 'SOM'(NO quotemarks)을 표시하는 것이다. 순간

, 나는이 :

내 템플릿 시스템과 함께 좋은 작품
'echo' => array(
      'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?)\}~sU', 
      'replace' => "'.\$this->_get('\\1').'" 
     ) 

는, 표준 변수를 에코 (즉, 'someValue와'). 그러나 사용자가 : 구분 기호를 사용하여 출력 할 문자 수를 제한 할 수 있도록하고 싶습니다. 즉 {somevalue : 3}은 'som'을 표시합니다.

내가 시도 :

'echo' => array(
      'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU', 
      'replace' => "'.substr(\$this->_get('\\1'),0,\\2).'" 
     ) 

하지만이 작동하지 않았다. 정규식을 이해하지 못해 정직하게 대응할 수 있도록 도와줍니다.

답변

0

새 검색 표현식에 '/'가 추가 된 것처럼 보입니다.

             | 
                 v 
'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU', 

저는 사용중인 템플릿 시스템에 익숙하지 않지만 대체 표현식을 변경해야하는 것으로 보입니다.

'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'" 

함께 다음을 넣고이 같은 시도 얻을 것 :

'echo' => array(
      'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*))\}~sU', 
      'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'" 
     ) 
이 작동하는 경우, 입력을하는 옛날 방식이 더 이상 작동하지 않습니다 주목해야한다

. 즉, 항상 이 아닌 {<string>:<num_of_chars>} 형식을 사용해야합니다.

+0

원래 {string}이 (가) 더 이상 작동하지 않는다는 것을 알았습니다. 이 문제를 해결하기 위해 'echolimit'이라는 배열의 새로운 요소이므로 기존 태그가 영향을받지 않도록 변경했습니다. 나는 당신의 코드를 시도했지만 작동하지 않았다. 나는 그것을 다음과 같이 변경했다 :''echolimit '=> array ( 'search '=>'~ \ {((? : '. $ this-> preg ['var '].') (? : \.)? : \\ 2 '). "" \t : \\ "~ \\ 2"). \t \t) '하지만 이제는 아무 것도 표시되지 않습니다 (기존의 다른 {tags}도 완벽하게 작동 함). – Amo

+0

substr은 첫 번째 매개 변수를 문자열로, 두 번째를 오프셋으로, 세 번째 매개 변수를 길이로 취해야합니다. 귀하의 버전에는 $ this -> _ get ('\\ 2')를 사용하는 세 번째 매개 변수가 있지만 $ this -> _ get()은 표시 할 템플릿에서 태그 변수를 찾는 함수입니다. 이 경우에는 {stringtodisplay : limit} 태그에 다음에 전달 된 번호가 있어야합니다. – Amo

+0

사용중인 템플릿 엔진에 대해 잘 모르기 때문에'$ this-> _get ('\\ 1')'은 $ this-> preg() 호출에서 첫 번째 캡처 그룹을 가져옵니다. 번호를 얻기 위해 두 번째 캡처 그룹을 추가하기 때문에 $ this -> _ get ('\\ 2')이이 작업을 수행한다고 가정했습니다. 내 코드 중첩 된 캡처 그룹이 필요하다는 것을 알았습니다. 이걸 시험해 볼 수 있니? ''echolimit '=> 배열 ('검색 '=>'~ \ {((? : '. $ this-> preg ['var '].') (? : \.)?) :([0-9 (\ $ this -> _ get ('\\ 1'), 0, \ $ this -> _ get ('\\ 2')).'')) –

0
$s = preg_replace_callback(
     '/\{([^:]+):(\d+)\}/', 
     create_function('$m', 'return substr($m[1], 0, $m[2]);'), $s); 

시험이 코드 here.

+0

여기의 코드는 기존 템플릿 파서와 맞지 않습니다. 그래서 'som'을 표시 함에도 불구하고 불행히도 내가 제공 한 것과 동일한 형식의 코드가 필요합니다. 전체 파싱 알고리즘을 다시 작성하기에는 너무 많은 시간과 노력이 필요할 것입니다. 내가 제공 한 것과 동일한 스타일의 코드? – Amo

관련 문제