Obtener el nombre del archivo de script actual


273

Si tengo un script PHP, ¿cómo puedo obtener el nombre del archivo desde ese script?

Además, dado el nombre de un script del formulario jquery.js.php, ¿cómo puedo extraer solo la parte "jquery.js"?


1
Estas son dos preguntas en una. ¿Cuál quieres saber? ¿Cómo decir el nombre del script actual, cómo cortar la extensión de un nombre de archivo, o ambos?
Pekka el

3
La palabra alsoindica que está haciendo una pregunta adicional. Sheesh Algunos píos niños.
digiscripter

Respuestas:


411

Simplemente use la constante mágica de PHP __FILE__ para obtener el nombre de archivo actual.

Pero parece que quieres la parte sin .php. Entonces...

basename(__FILE__, '.php'); 

Un removedor de extensión de archivo más genérico se vería así ...

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"

Usar las funciones estándar de la biblioteca de cadenas es mucho más rápido , como es de esperar.

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

1
¿Por qué no simplemente usar substry strrchrquitar el último .y todo lo que está detrás?
ThiefMaster

9
@ThiefMaster Porque hay algo integrado en PHP para manejar extensiones de archivo. La rueda existe y rueda bien.
alex

2
¡Pero una expresión regular podría ser más cara!
ThiefMaster

14
Si bien __FILE__le da el .phparchivo en el que está la línea, realmente desea $_SERVER['SCRIPT_NAME']el script de nivel superior que se está ejecutando actualmente (el que fue invocado por el servidor web o directamente en la línea de comando)
Drew Stephens

2
@Drew Supongo que eso depende de lo que realmente quieras.
alex

125

Cuando desee que su inclusión sepa en qué archivo está (es decir, qué nombre de script se solicitó realmente), use:

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

Porque cuando escribe en un archivo, generalmente conoce su nombre.

Editar: como señaló Alec Teal, si usa enlaces simbólicos, en su lugar mostrará el nombre del enlace simbólico.


44
Eso fue útil para mí)) necesitaba obtener el nombre del archivo de script, en el archivo requerido )
Denys Klymenko

44
Esto está mal, no obtendrá el archivo PHP real, pero el archivo que el servidor web resolvió a la solicitud. Diferente si usas enlaces sim.
Alec Teal

También es diferente si usa PHP-FPM.
Andrew Ensley

Además, si también necesita la extensión, usepathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd Si necesita la extensión, simplemente omita el segundo parámetro ...
SparK


56

Aquí está la diferencia entre basename(__FILE__, ".php")y basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")muestra el nombre del archivo donde se incluye este código: significa que si incluye este código en header.php y la página actual es index.php , devolverá el encabezado, no el índice .

basename($_SERVER["REQUEST_URI"], ".php")- Si utiliza incluir este código en header.php y la página actual es index.php , devolverá el índice, no el encabezado .


¿cuál es más seguro SCRIPT_FILENAMEo REQUEST_URI? Sé que ambos son variables de servidor, pero ¿no es REQUEST_URIun valor manipulado por el usuario? permite una amenaza de "inyección de URI"
SparK

1
ambos tienen su propia impotencia, pero puedes proteger tu url usando diferentes archivadores, como mysql_real_escape_string, stripslashes, etc.
Khandad Niazi

55
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");devolverá el nombre de la carpeta si el enlace es del formulario http://example.com/somefolder. Mientras basename($_SERVER['PHP_SELF'], ".php");que siempre devolverá el nombre del script, en este caso index.
katalin_2003

27

Esto podría ayudar:

basename($_SERVER['PHP_SELF'])

funcionará incluso si está utilizando include.


Eso todavía deja .phpal final del que el OP estaba tratando de deshacerse
Brian Leishman

3
@stumpx Entonces puedes hacerlobasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Tengo 2 archivos, header.php y home.php, el header.php se llama en home.php, ¿cómo puedo detectar en el encabezado que la página actual es home.php o contact.php para poder cambiar algún banner, etc.
Moxet Khan

19

La respuesta de alex es correcta, pero también podría hacerlo sin expresiones regulares como esta:

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

66
Esto corre el riesgo de destrozar un nombre de archivo como hey.php-i-am-a-weird-filename.php.
alex

Ya pensé en eso, pero pensé que lo estaban usando para la única página mencionada en la pregunta. También puede verificar si el ".php" está al final de la cadena. No digo que su pregunta sea incorrecta, pero las expresiones regulares pueden ser un poco molestas y generalmente se usan en escenarios en los que se podría usar un método mucho más simple y menos intensivo en recursos.
usuario

Shofner Ejecuté algunos puntos de referencia y su camino corre aproximadamente el doble de rápido, pero aún con más de 1000 iteraciones, la diferencia es 0.003231 microsegundos.
alex

16

Aquí hay una lista de lo que encontré recientemente buscando una respuesta:

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

No olvides eliminar :)

<br>


1
Entonces ... SCRIPT_NAME, SCRIPT_FILENAME y PHP_SELF son 3 cosas diferentes, ¿verdad? (¿Por qué tantos vars con el mismo valor? Rasmus estaba
drogado

Escenario: index.phpincluye lo header.phpque a su vez incluye functions.php, dónde log_location()reside. Me llamo log_location()en header.php, y luego corro index.php. Todas las funciones anteriores imprimen ya sea función o índice o dominio o alguna variación de estos. No quiero saber qué script PHP llamó a la función. ¿Es posible (en una sola línea)? @begoyan
s3c

6

También puedes usar esto:

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

4

Una forma más general sería usar pathinfo () . Desde la versión 5.2 es compatible PATHINFO_FILENAME.

Entonces

pathinfo(__FILE__,PATHINFO_FILENAME)

también hará lo que necesites.


2

$ argv [0]

Lo he encontrado mucho más simple de usar $argv[0]. El nombre de la secuencia de comandos en ejecución es siempre el primer elemento de la $argvmatriz. A diferencia de todos los demás métodos sugeridos en otras respuestas, este método no requiere el uso de basename()para eliminar el árbol de directorios. Por ejemplo:

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

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



2

Esto funciona para mí, incluso cuando se ejecuta dentro de un archivo PHP incluido, y desea que se ejecute el nombre de archivo del archivo php actual:

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

Resultado:

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__ Utilice ejemplos basados ​​en los resultados del 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

0

Como algunos dijeron basename($_SERVER["SCRIPT_FILENAME"], '.php')ybasename( __FILE__, '.php') son buenas formas de probar esto.

Para mí, usar el segundo fue la solución para algunas instrucciones de validación que estaba haciendo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.