문자열에서 확장을 제거하는 방법 (실제 확장 만!)


135

파일 이름에서 확장명을 제거 할 수있는 작은 기능을 찾고 있습니다.

인터넷 검색을 통해 많은 예를 찾았지만 "."로 문자열의 일부만 제거하기 때문에 나쁩니다. . 그들은 리미터에 점을 사용하고 문자열을 자릅니다.

이 스크립트들을보세요

$from = preg_replace('/\.[^.]+$/','',$from);

또는

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

다음과 같이 문자열을 추가하면

this.is somestring의 예입니다

"This"만 반환합니다 ...

확장자는 3 ~ 4자를 가질 수 있으므로 점이 4 또는 5 위치에 있는지 확인한 다음 제거해야합니다.

어떻게 할 수 있습니까?


1
"실제"확장이란 무엇입니까? 점 앞에있는 마지막 4 자 또는 les 문자를 제거 하시겠습니까?
clyfe

"Col. Shrapnel"-Windows 사용자를 위해 설계되었습니다. "clyfe"-예, 점 뒤에있는 모든 것을 제거하고 싶지만 4 또는 5 위치에있는 경우에만 ".jpeg"또는 ".mp3"을 나타냅니다. 나는 그것을 제거하고 싶지 않습니다. str-pos를 사용하여 수동으로 수행 할 수 있고 if 문을 사용하여 문자열을자를 수 있다는 것을 알고 있습니다 (5 pos = dot 다음 오른쪽 5 자에서 자르기 (rtrim), 4 pos = dot 다음 rtrim 4 인 경우 수정하지 않고 반환). 아마도 더 빠른 해결책 일 것입니다.
marc

3
.package 파일은 어떻습니까? 아니면 .unity? 확장명을 4 자로 제한하는 임의의 비트 인 것 같습니다.
rdb

답변:


172

이거 한번 해봐:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

따라서 이것은 점이나 공백이 아닌 3 ~ 4 개의 문자가 뒤에 오는 점과 일치합니다. 더 짧거나 더 긴 파일 확장자가 많으므로 "3 또는 4"규칙을 완화해야합니다.


문제는 다음과 같은 파일 이름을 바꾸는 사람들도 있다는 것입니다.20120720.something.somethingelse.jpg
Obmerk Kronen

3
나는 이것이 확장으로 두 문자를 가진 파일과 함께 작동하지 않을 것이라고 생각합니다
NaturalBornCamper

1
타이! 변수 대체를 수행하지 않으면 작은 따옴표를 사용해야합니다. 예 :"$var"
aelgoa

글쎄, .py 파일과 함께 사용하려면 3,4 대신 2,3,4를 추가해야한다고 생각합니다 :> 감사합니다!
voghDev 2016 년

2
당신은 추가해야 2 ~ 4 문자로 지원 확장에 @voghDev {2,4}대신{3,4}
티모 Huovinen


81

설명서에서 pathinfo :

<?php
    $path_parts = pathinfo('/www/htdocs/index.html');

    echo $path_parts['dirname'], "\n";
    echo $path_parts['basename'], "\n";
    echo $path_parts['extension'], "\n";
    echo $path_parts['filename'], "\n"; // Since PHP 5.2.0
?>

제대로 작동하기위한 완벽한 경로 일 필요는 없습니다. 마찬가지로 행복하게 구문 분석 file.jpg합니다 /path/to/my/file.jpg.


나는 이미 이것을 확인했다. 위와 같은 실수. T.sec- "xxx"에서 "$ path_parts [ 'filename']"에 액세스 해보십시오. 23 12 32 3 a twym2 T 만 반환합니다. 위 예제에서 아무것도 제거하면 안됩니다!
marc

56

사용 PHP의 기본 이름 ()

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

출력 : string (4) "test"


2
+1 확장에 대해 언급 된 요구 사항이 엄격하지 않은 경우 완벽한 답변이 될 것입니다.
Kayla

1
php.net 의 커밋을 살펴보면 배열 작업에 대한 아이디어가 있습니다 ... 배열 걷기
CrandellWS

35

이것은 다소 쉬운 해결책이며 문자열에 확장 시간이나 도트 또는 기타 문자 수에 관계없이 작동합니다.

$filename = "abc.def.jpg";

$newFileName = substr($filename, 0 , (strrpos($filename, ".")));

//$newFileName will now be abc.def

기본적으로 이것은 단지 마지막 발생을 찾습니다. 그런 다음 하위 문자열을 사용하여 해당 지점까지의 모든 문자를 검색합니다.

Google 예제 중 하나와 비슷하지만 정규 표현식 및 다른 예제보다 간단하고 빠르며 쉽습니다. 어쨌든 imo. 그것이 누군가를 돕기를 바랍니다.


2
나는 이것이 너무 늦어지고 있다는 것을 알고 있지만 이것이 최선의 대답이라고 생각합니다. 잘 작동합니다.
Agbogidi Michael

확장자가없는 * nix 숨김 파일에는 작동하지 않습니다..htaccess
Fr0zenFyr

12

PHP가 내장 한 것을 사용하여 도움을 줄 수 있습니다 ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

파일 이름 ( .somefile.jpg) 만 다루면 ...

./somefile

CodePad.org에서 확인하십시오

아니면 정규식을 사용하십시오 ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

CodePad.org에서 확인하십시오

경로가 없지만 파일 이름 만 있으면 작동하며 훨씬 더 간결합니다 ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

CodePad.org에서 확인하십시오

물론 둘 다 마지막 기간 ( .)을 찾습니다 .


마지막 솔루션 줄에서 언급했듯이 다음과 같은 파일 이름은 실패합니다..htaccess
Fr0zenFyr

8

다음 코드는 저에게 효과적이며 꽤 짧습니다. 파일을 점으로 구분 된 배열로 나누고 마지막 요소 (가상적으로 확장명)를 삭제 한 다음 점으로 배열을 다시 재구성합니다.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

파일 인 경우 파일 확장자가없는 경우 false를 반환 또는 빈 것.htaccess
티모 Huovinen

5

Google에서 많은 예제를 찾았지만 "."로 문자열의 일부를 제거하기 때문에 잘못되었습니다.

실제로 그것은 절대적으로 올바른 일입니다. 계속해서 사용하십시오.

파일 확장자는 마지막 점 뒤의 모든 것이므로 파일 확장자가 특정 문자 수일 필요는 없습니다. Windows에 대해서만 말하더라도, 예를 들어 3-4 자로 맞지 않는 파일 확장자가 이미 제공됩니다. .manifest.


2
.. 그리고의 잊지 말자 .htaccess.htpasswd아파치 환경에서.
h2ooooooo

5

권장 사용법 : pathinfo with PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

4

몇 가지 방법이 있지만 더 빠른 방법 중 하나는 다음과 같습니다.

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

또 다른 해결책은 이것입니다. 테스트하지는 않았지만 파일 이름에서 여러 기간 동안 작동하는 것처럼 보입니다.

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

또한:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

이 모든 $name파일에는 확장자가없는 파일 이름 이 포함됩니다.


4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

산출:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);파일 확장자를 얻으려면 추가하십시오.
I_ATE_YOUR_WORK_FILES

2

다른 사람들이 언급했듯이 확장을 특정 문자 수로 제한한다는 아이디어는 유효하지 않습니다. 구분 된 문자열을 배열로 생각하는 array_pop의 아이디어와 함께이 기능은 나에게 유용했습니다 ...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

용법:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

출력 :

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

실제로 :

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0


1

{x,y}연산자 를 사용하여 정규식 패턴의 길이를 설정할 수 있습니다 . {3,4}선행 패턴이 3 번 또는 4 번 발생하면 일치합니다.

그러나 나는 당신이 정말로 필요하다고 생각하지 않습니다. "This.is"라는 파일로 무엇을 하시겠습니까?


0

이것을 사용하십시오 :

strstr('filename.ext','.',true);
//result filename

파일 이름에 마침표가없는 경우에만 작동합니다. PHP 문서는 바늘의 첫 번째 항목 언급
relipse

0

이것을 사용하십시오. 파일 확장자가 반드시 제거됩니다.

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'

array_pop ()으로 이것을 한 줄로 줄일 수 있습니다
Peter Brand

0

편집 : 가장 똑똑한 방법 IMHO 는 파일 이름에서 마지막 지점과 다음 텍스트 를 제거합니다 (일명 확장명).

$name = basename($filename, '.' . end(explode('.', $filename)));

건배;)


작동 할 수는 있지만 end()매개 변수로 전달 된 함수로는 작동하지 않아야합니다. 또한 알림을 생성합니다. 변수 만 참조로 전달해야합니다.
CodeBrauer

0

확장에 여러 부품이있을 때 작동하며 짧고 효율적입니다.

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.