Obter o nome do arquivo de script atual

273

Se eu tenho um script PHP, como posso obter o nome do arquivo dentro desse script?

Além disso, dado o nome de um script do formulário jquery.js.php, como posso extrair apenas a parte "jquery.js"?

Alex
fonte
1
Essas são duas perguntas em uma. Qual você quer saber? Como saber o nome do script atual, como cortar a extensão de um nome de arquivo ou ambos?
Pekka
3
A palavra alsoindica que você está fazendo uma pergunta adicional. Sheesh. Alguns espreitam crianças.
digiscripter

Respostas:

411

Basta usar a constante mágica do PHP__FILE__ para obter o nome do arquivo atual.

Mas parece que você quer a parte sem .php. Assim...

basename(__FILE__, '.php'); 

Um removedor de extensão de arquivo mais genérico ficaria assim ...

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"

O uso de funções padrão da biblioteca de strings é muito mais rápido , como seria de esperar.

function chopExtension($filename) {
    return substr($filename, 0, strrpos($filename, '.'));
}
alex
fonte
1
Por que não simplesmente usar substre strrchrtirar o último .e tudo o que está por trás dele?
ThiefMaster 19/11/2010
9
@ThiefMaster Porque há algo embutido no PHP para lidar com extensões de arquivo. A roda existe e rola bem.
alex
2
Mas uma regex pode ser mais cara!
ThiefMaster 19/11/2010
14
Enquanto __FILE__dá-lhe o .phparquivo que linha está em, você realmente quer $_SERVER['SCRIPT_NAME']para o script de nível superior atualmente em execução (o que foi invocado pelo servidor web ou diretamente na linha de comando)
de Drew Stephens
2
@ Drew Eu acho que depende do que você realmente quer.
alex
125

Quando você quiser que seu include saiba em que arquivo ele está (ou seja, qual nome de script foi realmente solicitado), use:

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

Porque quando você está gravando em um arquivo, geralmente sabe o nome dele.

Editar: Como observado por Alec Teal, se você usar links simbólicos, ele exibirá o nome do link simbólico.

Faísca
fonte
4
Isso foi útil para mim)) necessários para obter o nome do arquivo de script, em arquivo necessário )
Denys Klymenko
4
Isso está errado, ele não receberá o arquivo PHP real, mas o arquivo que o servidor da Web resolveu para a solicitação. Diferente se você usar simlinks.
Alec Teal
Também é diferente se você usa PHP-FPM.
precisa
Além disso, se você precisar da extensão também, usepathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd
@ c00000fd Se você precisar da extensão, omita o segundo parâmetro ...
SparK 14/03
56

Aqui está a diferença entre basename(__FILE__, ".php")e basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")mostra o nome do arquivo em que esse código está incluído - significa que se você incluir esse código no header.php e a página atual for index.php , ele retornará o cabeçalho, não o índice .

basename($_SERVER["REQUEST_URI"], ".php")- Se você incluir esse código no header.php e a página atual for index.php , ele retornará o índice não o cabeçalho .

Khandad Niazi
fonte
qual é mais seguro SCRIPT_FILENAMEou REQUEST_URI? Eu sei que os dois são vários servidores, mas não é REQUEST_URIum valor violado pelo usuário? ele permite uma "injeção de URI" ameaça
faísca
1
os dois têm sua própria impotência, mas você pode proteger seu URL usando diferentes arquivadores, como mysql_real_escape_string, stripslashes etc.
Khandad Niazi
5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");retornará o nome da pasta se o link for do formulário http://example.com/somefolder. Enquanto basename($_SERVER['PHP_SELF'], ".php");sempre retornará o nome do script, neste caso index.
Jun
27

Isso pode ajudar:

basename($_SERVER['PHP_SELF'])

funcionará mesmo se você estiver usando o include.

charan315
fonte
Isso ainda deixa .phpno final que o OP estava tentando se livrar
Brian Leishman
3
@stumpx Então você pode fazerbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003
Eu tenho 2 arquivos, header.php e home.php, o header.php é chamado em home.php como posso detectar no cabeçalho que a página atual é home.php ou contact.php para que eu possa alterar algum banner etc.
Moxet Khan
19

a resposta de alex está correta, mas você também pode fazer isso sem expressões regulares como:

str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));
do utilizador
fonte
6
Isso corre o risco de confundir um nome de arquivo como hey.php-i-am-a-weird-filename.php.
alex
Eu já pensei nisso, mas achei que eles estavam usando a página única mencionada na pergunta. Você também pode verificar se o ".php" está no final da string. Não estou dizendo que sua pergunta está errada, mas expressões regulares podem ser uma espécie de problema e geralmente são usadas em cenários em que um método muito mais simples e com menos recursos pode ser usado.
User
Shofner Fiz alguns benchmarks e seu caminho é duas vezes mais rápido, mas mesmo assim, com mais de 1000 iterações, a diferença é 0,003231 microssegundos.
alex
16

Aqui está uma lista que encontrei recentemente pesquisando uma resposta:

//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']);

Não se esqueça de remover :)

<br>

begoyan
fonte
1
Então ... SCRIPT_NAME, SCRIPT_FILENAME e PHP_SELF são três coisas diferentes, certo? (Por que tantas vars com mesmo valor ?! Rasmus estava em drogas, com certeza)
faísca
Cenário: index.phpinclui o header.phpque por sua vez inclui functions.php, onde log_location()reside. Eu chamo log_location()em header.php, em seguida, eu corro index.php. Todas as funções acima imprimem função, índice ou domínio ou alguma variação delas. Não quero saber qual script PHP chamou de função. É mesmo possível (em uma linha)? @begoyan
s3c 18/02
6

você também pode usar isto:

echo $pageName = basename($_SERVER['SCRIPT_NAME']);
Shah Alom
fonte
4

Uma maneira mais geral seria usar pathinfo () . Desde a versão 5.2, ele suportaPATHINFO_FILENAME .

assim

pathinfo(__FILE__,PATHINFO_FILENAME)

também fará o que você precisa.

Megachip
fonte
2

$ argv [0]

Eu achei muito mais simples de usar $argv[0]. O nome do script em execução é sempre o primeiro elemento da $argvmatriz. Ao contrário de todos os outros métodos sugeridos em outras respostas, esse método não requer o uso de basename()para remover a árvore de diretórios. Por exemplo:

  • echo __FILE__; retorna algo como /my/directory/path/my_script.php

  • echo $argv[0]; retorna my_script.php

JBH
fonte
2

Tente isto

$current_file_name = $_SERVER['PHP_SELF'];
echo $current_file_name;

Wakar Ahmad Khan
fonte
2

Isso funciona para mim, mesmo quando executado dentro de um arquivo PHP incluído, e você deseja que o nome do arquivo php atual seja executado:

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

Resultado:

index.php

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

__FILE__ use exemplos com base nos resultados do servidor 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
Dariusz Sikorski
fonte
0

Como alguns disseram basename($_SERVER["SCRIPT_FILENAME"], '.php')ebasename( __FILE__, '.php') são boas maneiras de testar isso.

Para mim, usar o segundo foi a solução para algumas instruções de validação que eu estava fazendo

Gendrith
fonte