2009-10-02 7 views
0

에있는 파일을 선택하고 내가 ... 내가 가진 파일 이름이 폴더에서 모든 다른 템플릿 파일을 선택하고 다음 코드입니다있다 :는 preg_match 도움말 : 폴더

template_default.php

template_default_load. PHP

template_sub.php

template_sub_load.php 나는 단지 인터넷에서 _load없이 사람을 선택합니다

르 이름 그래서 난이 코드를 사용 : 나는 에코 때 대신 기본 또는 하위를 반환하는 ... 결과 오프 마지막 문자를 잘라 제외

preg_match('/^template_(.*)[^[_load]]{0}\.php$/i', $layout_file, $layout_name) 

코드는 잘 작동을 $ LAYOUT_NAME [1],이 표시가 기본으로하고 su ...

내 코드에 어떤 문제가 있습니까?

답변

2

이 부분은 완전히 크릭 달려있다 :

[^[_load]]{0} 

이 원하는 정규식 :

/^template_(.*)(?<!_load)\.php$/i 
0

당신은 negative assertions을 사용해야합니다.

preg_match('/^template_(.*?)(?!_load)\.php$/i', $layout_file, $layout_name) 

편집 (왜 아래를 참조) : "_load"이 .*? 부분에서 소비되기 때문에 그 정규 표현식이 실제로 작동하지 않습니다 그것을 생각 온다. 조언 : preg_match()를 사용하여 이름을 캡처하지 말고 _load으로 끝나는 항목을 건너 뜁니다. 예 :

foreach (glob('template_*') as $filepath) 
{ 
    if (preg_match('#_load\\.php$', $filepath)) 
    { 
     // The file ends with _load 
    } 
    $filename = basename($filepath); 
    $layout_name = substr($filename, strlen('template_')); 
} 
+0

이것은 작동하지 않습니다. 대신 횡단 부정 표명 (look-behind negative assertion)을 사용해야합니다. –

+0

그래, 나는 그것에 대해 올바른 생각을하고 있지 않았다. 하위 문자열이 붙지 않는 무언가를 포착하기를 원한다고하더라도, 그 앞에 있지 않은 다른 무언가를 찾아야합니다. –