현재 스크립트 파일 이름을 가져옵니다


273

PHP 스크립트가있는 경우 해당 스크립트 내에서 파일 이름을 어떻게 얻을 수 있습니까?

또한 양식의 스크립트 이름이 주어지면 jquery.js.php"jquery.js"부분 만 어떻게 추출 할 수 있습니까?


1
이것은 하나의 두 가지 질문입니다. 어느 것을 알고 싶습니까? 현재 스크립트 이름을 알려주는 방법, 파일 이름에서 확장명을 잘라내는 방법 또는 둘 다?
Pekka

3
단어 also는 추가 질문을하고 있음을 나타냅니다. esh. 일부 친구들.
digiscripter 2019

답변:


411

PHP 매직 상수 __FILE__ 를 사용하여 현재 파일 이름을 얻으십시오.

그러나 당신이없는 부분을 원하는 것 같습니다 .php. 그래서...

basename(__FILE__, '.php'); 

더 일반적인 파일 확장자 제거제는 다음과 같습니다.

function chopExtension($filename) {
    return pathinfo($filename, PATHINFO_FILENAME);
}

var_dump(chopExtension('bob.php')); // string(3) "bob"
var_dump(chopExtension('bob.i.have.dots.zip')); // string(15) "bob.i.have.dots"

예상대로 표준 문자열 라이브러리 함수를 사용하는 것이 훨씬 빠릅니다 .

function chopExtension($filename) {
    return substr($filename, 0, strrpos($filename, '.'));
}

1
왜 단순히 사용 substr하고 strrchr마지막 없애기 .과 모든 것을 뒤로?
ThiefMaster

9
@ThiefMaster 파일 확장자를 처리하기 위해 PHP에 내장 된 것이 있기 때문입니다. 바퀴가 존재하고 잘 굴립니다.
alex

2
그러나 정규 표현식이 더 비쌀 수 있습니다!
ThiefMaster

14
해당 줄에 __FILE__있는 .php파일을 제공 하지만 실제로 $_SERVER['SCRIPT_NAME']는 현재 실행중인 최상위 스크립트 (웹 서버에 의해 또는 명령 줄에서 직접 호출 된 스크립트)를 원합니다.
Drew Stephens

2
@ 드류 나는 그것이 당신이 정말로 원하는 것에 달려 있다고 생각합니다.
alex

125

포함 파일에 어떤 파일이 있는지 (예 : 실제로 요청 된 스크립트 이름) 알기를 원하면 다음을 사용하십시오.

basename($_SERVER["SCRIPT_FILENAME"], '.php')

파일에 쓸 때 일반적으로 파일 이름을 알고 있기 때문입니다.

편집 : Alec Teal이 지적한 것처럼 심볼릭 링크를 사용하면 심볼릭 링크 이름이 대신 표시됩니다.


4
즉에서, 스크립트 파일 이름을 얻을 필요)) 나에게 도움이되었습니다 필요한 파일 )
데니스 Klymenko

4
이것은 실제 PHP 파일을 얻지 못하지만 웹 서버가 요청으로 확인한 파일은 아닙니다. simlinks를 사용하는 경우 다릅니다.
Alec Teal

PHP-FPM을 사용하는 경우에도 다릅니다.
앤드류 엔 슬리

또한 확장 기능이 필요한 경우 다음을 사용하십시오.pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd 확장 기능이 필요한 경우 두 번째 매개 변수를 생략하면됩니다.
SparK


56

여기서 간의 차이 basename(__FILE__, ".php")basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")이 코드가 포함 된 파일 이름을 보여줍니다. 즉,이 코드를 header.php에 포함 하고 현재 페이지가 index.php 이면 index가 아닌 헤더 를 반환 합니다.

basename($_SERVER["REQUEST_URI"], ".php")-이 코드를 header.php에 포함 하고 현재 페이지가 index.php 이면 헤더가 아닌 인덱스 를 반환 합니다.


안전 이는 SCRIPT_FILENAMEREQUEST_URI? 둘 다 서버 변수이지만 REQUEST_URI사용자가 값을 변경 하지 않았습니까? "URI 주입"위협을 가능하게합니다
SparK

1
둘 다 자신의 발기 부전을 가지고 있지만, 당신은 mysql_real_escape_string, stripslashes 등과 같은 다른 파일러를 사용하여 URL을 안전하게 할 수 있습니다.
Khandad Niazi

5
basename($_SERVER["REQUEST_URI"], ".php");링크가 양식 인 경우 @KhandadNiazi 는 폴더 이름을 반환합니다 http://example.com/somefolder. while basename($_SERVER['PHP_SELF'], ".php");은 항상 스크립트 이름을 반환합니다 (이 경우) index.
katalin_2003

27

도움이 될 수 있습니다.

basename($_SERVER['PHP_SELF'])

include를 사용하더라도 작동합니다.


여전히를 떠난다 .php영업 이익이 없애려고하는 말
브라이언 Leishman

3
@stumpx 그럼하실 수 있습니다basename($_SERVER['PHP_SELF'], ".php");
katalin_2003

header.php와 home.php라는 2 개의 파일이 있는데 header.php는 home.php에서 호출됩니다. 헤더에서 현재 페이지가 home.php 또는 contact.php임을 감지하여 배너 등을 변경할 수 있습니다.
Moxet Khan

19

alex의 대답은 정확하지만 정규 표현식 없이이 작업을 수행 할 수도 있습니다.

str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));

6
이 같은 파일 이름을 조작 할 위험이 hey.php-i-am-a-weird-filename.php있습니다.
alex

나는 이미 그것을 생각했지만 질문에 언급 된 단일 페이지에 사용하고 있다고 생각했습니다. ".php"가 문자열의 끝에 있는지 확인할 수도 있습니다. 당신의 질문이 틀렸다고 말하지는 않지만 규칙적인 압박은 엉덩이에 약간의 고통이 될 수 있으며 일반적으로 훨씬 간단하고 덜 자원 집약적 인 방법을 사용할 수있는 시나리오에서 사용됩니다.
사용자

Shofner 나는 몇 가지 벤치 마크를 실행했으며 귀하의 방식은 약 두 배 빠르지 만 여전히 1000 회 이상 반복하면 0.003231 마이크로 초입니다.
alex

16

최근에 답변을 검색 한 결과는 다음과 같습니다.

//self name with file extension
echo basename(__FILE__) . '<br>';
//self name without file extension
echo basename(__FILE__, '.php') . '<br>';
//self full url with file extension
echo __FILE__ . '<br>';

//parent file parent folder name
echo basename($_SERVER["REQUEST_URI"]) . '<br>';
//parent file parent folder name with //s
echo $_SERVER["REQUEST_URI"] . '<br>';

// parent file name without file extension
echo basename($_SERVER['PHP_SELF'], ".php") . '<br>';
// parent file name with file extension
echo basename($_SERVER['PHP_SELF']) . '<br>';
// parent file relative url with file etension
echo $_SERVER['PHP_SELF'] . '<br>';

// parent file name without file extension
echo basename($_SERVER["SCRIPT_FILENAME"], '.php') . '<br>';
// parent file name with file extension
echo basename($_SERVER["SCRIPT_FILENAME"]) . '<br>';
// parent file full url with file extension
echo $_SERVER["SCRIPT_FILENAME"] . '<br>';

//self name without file extension
echo pathinfo(__FILE__, PATHINFO_FILENAME) . '<br>';
//self file extension
echo pathinfo(__FILE__, PATHINFO_EXTENSION) . '<br>';

// parent file name with file extension
echo basename($_SERVER['SCRIPT_NAME']);

제거하는 것을 잊지 마십시오 :)

<br>


1
SCRIPT_NAME, SCRIPT_FILENAME 및 PHP_SELF는 3 가지입니다. (동일한 가치를 가진 많은 종류의 이유는 무엇입니까?! Rasmus는 확실히 약을
먹었습니다

시나리오 : index.php포함 header.php차례 포함 functions.php, 어디에 log_location()거주하고 있습니다. 에 전화 log_location()header.php한 다음 실행 index.php합니다. 위의 모든 기능은 기능이나 색인 또는 도메인 또는 이들의 일부 변형을 인쇄합니다. 함수를 호출 한 PHP 스크립트를 알고 싶지 않습니다. (한 줄짜리) 가능합니까? @begoyan
s3c

6

이것을 사용할 수도 있습니다 :

echo $pageName = basename($_SERVER['SCRIPT_NAME']);

4

보다 일반적인 방법은 pathinfo ()를 사용하는 것 입니다. 버전 5.2부터는을 지원합니다 PATHINFO_FILENAME.

그래서

pathinfo(__FILE__,PATHINFO_FILENAME)

또한 필요한 것을 할 것입니다.


2

$ argv [0]

사용하기가 훨씬 간단하다는 것을 알았습니다 $argv[0]. 실행 스크립트의 이름은 항상 $argv배열 의 첫 번째 요소입니다 . 다른 답변에서 제안 된 다른 모든 방법과 달리이 방법은 basename()디렉토리 트리를 제거 할 필요가 없습니다 . 예를 들면 다음과 같습니다.

  • echo __FILE__; 같은 것을 반환 /my/directory/path/my_script.php

  • echo $argv[0]; 보고 my_script.php



2

이것은 포함 된 PHP 파일 내에서 실행될 때도 작동하며 현재 PHP 파일의 파일 이름을 실행하려고합니다.

$currentPage= $_SERVER["SCRIPT_NAME"];
$currentPage = substr($currentPage, 1);
echo $currentPage;

결과:

index.php


0
$filename = "jquery.js.php";
$ext = pathinfo($filename, PATHINFO_EXTENSION);//will output: php
$file_basename = pathinfo($filename, PATHINFO_FILENAME);//will output: jquery.js

0

__FILE__ localhost 서버 결과를 기반으로 예제를 사용하십시오.

echo __FILE__;
// C:\LocalServer\www\templates\page.php

echo strrchr( __FILE__ , '\\' );
// \page.php

echo substr( strrchr( __FILE__ , '\\' ), 1);
// page.php

echo basename(__FILE__, '.php');
// page

0

일부는 말했다시피 basename($_SERVER["SCRIPT_FILENAME"], '.php')하고 basename( __FILE__, '.php')이를 테스트하는 좋은 방법이 있습니다.

두 번째를 사용하는 것은 내가 만든 일부 유효성 검사 지침에 대한 솔루션이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.