2011-02-09 4 views
1

에서 부분으로 문자열을 분리하는 방법 지금은 유무 : $ 파일 2가 반환 될 때는 PHP

$path2 = $file_list1; 
$dir_handle2 = @opendir($path2) or die("Unable to open $path2"); 
while ($file2 = readdir($dir_handle2)) { 
if($file2 == "." || $file2 == ".." || $file2 == "index.php") 
continue; 
echo ''.$file2.'<br />'; 
} 
closedir($dir_handle2); 
echo '<br />'; 

, 문자열의 마지막 4 개 문자는 항상 숫자를 더한 파일 확장명이 .txt 같은 종료됩니다 이 :

file_name_here1.txt 
some_other-file10.txt 

그래서 제 질문은, 어떻게 $ 파일 2가 그래서 두 부분으로, $ file_name을에서 문자열을 반환하고 CALL_NUMBER이 같은 $가

echo 'File: '.$file_name.' Call: '.call_number.'<br />'; 
,536을? : 분리 할 수있다개

반환 값 : 대신의

File: file_name_here Call: 1 
File: some_other-file Call: 10 

:

echo ''.$file2.'<br />'; 

결과 :

file_name_here1.txt 
some_other-file10.txt 

감사합니다 ....

+0

파일 이름에도 숫자가 포함될 수 있습니까? '예'인 경우 원래 파일 이름이 숫자로 끝나면 ("전화 번호"와 구별 할 수 없음) 어떻게해야합니까? –

답변

1

나는 정규식의 큰 옹호 해요하지만 난 여기에 약간 다른 이동하기로 결정했다. 확인해보십시오 :

$file = 'file_name_here19.txt'; 
$file_parts = pathinfo($file); 
$name = $file_parts['filename']; 
$call = ''; 
$char = substr($name, strlen($name) - 1); 
while(ord($char) >= 48 && ord($char) <= 57) { 
    $call = $char . $call; 
    $name = substr($name, 0, strlen($name) - 1); 
    $char = substr($name, strlen($name) - 1); 
} 
echo 'Name: ' . $name . ' Call: ' . $call; 
+0

이것이 내 솔루션 인 것 같습니다. 그러나 파일 이름이 숫자로 끝나면 언급 한대로 $ call에 추가됩니다. 따라서 각 파일 이름이 "file_name_1__123.txt, this_file_name_2__456.txt"로 끝난다 고 가정합니다. 여기서 끝은 항상 "2, 밑줄 #, .txt"입니다. 그에 따라 응답을 어떻게 수정합니까? – mobilestimulus

+0

오, 아시다시피, while 루프 다음에 또 다른 substr() 호출 만하면됩니다. $ name = substr ($ name, 0, strlen ($ name) -2)과 같은 것; 그것은 테스트되지 않았으므로 -2가 밑줄을 잘라내 기위한 정확한 양인지 확인하십시오. –

+0

빙고! 많이 고마워 .... – mobilestimulus

1

은 당신이 할 정규식을 사용할 필요가,이 시도 이게 사실적이다.

$filename = reset(explode(".", $file2)) 
preg_match("#(^[a-zA-Z\_\-]*)([\d]*)#", $filename, $matches); 
$fullMatch = $matches[0]; 
$file = $matches[1]; 
$call = $matches[2]; 

echo "File: " . $file . " Call: " . $call; 
0
  1. 파일 확장자를 줄이려면 pathinfo() function을 사용하십시오.
  2. preg_match() function을 사용하여 번호와 이름을 구분하십시오. 3.

    while (...) { 
        ... 
    
        $filename; // some_other-file10.txt 
        $filename = pathinfo($filename, PATHINFO_FILENAME); // some_other-file10 
        preg_match('/^(?<name>.*?)(?<number>\d+)$/', $filename, $match); 
    
        $match['name']; // some_other-file 
        $match['number']; // 10 
    
        echo "File: {$match['name']} Call: {$match['number']}\n"; 
    } 
    
+0

'basename'은 접미사를 지정한 경우에만 접미사를 제거합니다. 그리고 당신의 표현에'. * + '가 있어야합니까? '. *? '을 의미 했습니까? –

+0

작전 ... 내 실수. – Crozin

1

를 사용하여 정규 표현식 :

preg_match("/^(.+)(\d+)(\..+)$/", $file2, $matches); 
$file_name = $matches[1]; 
$call_number = $matches[2];