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.
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 ...
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 .
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.
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:
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']);
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
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
also
indica que você está fazendo uma pergunta adicional. Sheesh. Alguns espreitam crianças.Respostas:
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...Um removedor de extensão de arquivo mais genérico ficaria assim ...
O uso de funções padrão da biblioteca de strings é muito mais rápido , como seria de esperar.
fonte
substr
estrrchr
tirar o último.
e tudo o que está por trás dele?__FILE__
dá-lhe o.php
arquivo 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)Quando você quiser que seu include saiba em que arquivo ele está (ou seja, qual nome de script foi realmente solicitado), use:
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.
fonte
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Veja http://php.net/manual/en/function.pathinfo.php
fonte
Aqui está a diferença entre
basename(__FILE__, ".php")
ebasename($_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 .fonte
SCRIPT_FILENAME
ouREQUEST_URI
? Eu sei que os dois são vários servidores, mas não éREQUEST_URI
um valor violado pelo usuário? ele permite uma "injeção de URI" ameaçabasename($_SERVER["REQUEST_URI"], ".php");
retornará o nome da pasta se o link for do formuláriohttp://example.com/somefolder
. Enquantobasename($_SERVER['PHP_SELF'], ".php");
sempre retornará o nome do script, neste casoindex
.Isso pode ajudar:
funcionará mesmo se você estiver usando o include.
fonte
.php
no final que o OP estava tentando se livrarbasename($_SERVER['PHP_SELF'], ".php");
a resposta de alex está correta, mas você também pode fazer isso sem expressões regulares como:
fonte
hey.php-i-am-a-weird-filename.php
.Aqui está uma lista que encontrei recentemente pesquisando uma resposta:
Não se esqueça de remover :)
fonte
index.php
inclui oheader.php
que por sua vez incluifunctions.php
, ondelog_location()
reside. Eu chamolog_location()
emheader.php
, em seguida, eu corroindex.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)? @begoyanvocê também pode usar isto:
fonte
Uma maneira mais geral seria usar pathinfo () . Desde a versão 5.2, ele suporta
PATHINFO_FILENAME
.assim
também fará o que você precisa.
fonte
$ argv [0]
Eu achei muito mais simples de usar
$argv[0]
. O nome do script em execução é sempre o primeiro elemento da$argv
matriz. Ao contrário de todos os outros métodos sugeridos em outras respostas, esse método não requer o uso debasename()
para remover a árvore de diretórios. Por exemplo:echo __FILE__;
retorna algo como/my/directory/path/my_script.php
echo $argv[0];
retornamy_script.php
fonte
Tente isto
fonte
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:
Resultado:
fonte
fonte
__FILE__
use exemplos com base nos resultados do servidor localhost:fonte
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
fonte