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"?

Alex
fuente
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, '.'));
}
alex
fuente
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.

Chispa - chispear
fuente
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 .

Khandad Niazi
fuente
¿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.

charan315
fuente
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"]));
usuario
fuente
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>

begoyan
fuente
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']);
Shah Alom
fuente
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.

Megachip
fuente
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

JBH
fuente
2

Prueba esto

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

Wakar Ahmad Khan
fuente
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

Bolli
fuente
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
fuente
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
Dariusz Sikorski
fuente
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

Gendrith
fuente