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,'.'));}
¿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.
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.
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:
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']);
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
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
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:
also
indica que está haciendo una pregunta adicional. Sheesh Algunos píos niños.Respuestas:
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...Un removedor de extensión de archivo más genérico se vería así ...
Usar las funciones estándar de la biblioteca de cadenas es mucho más rápido , como es de esperar.
fuente
substr
ystrrchr
quitar el último.
y todo lo que está detrás?__FILE__
le da el.php
archivo 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)Cuando desee que su inclusión sepa en qué archivo está (es decir, qué nombre de script se solicitó realmente), use:
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.
fuente
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Ver http://php.net/manual/en/function.pathinfo.php
fuente
Aquí está la diferencia entre
basename(__FILE__, ".php")
ybasename($_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 .fuente
SCRIPT_FILENAME
oREQUEST_URI
? Sé que ambos son variables de servidor, pero ¿no esREQUEST_URI
un valor manipulado por el usuario? permite una amenaza de "inyección de URI"basename($_SERVER["REQUEST_URI"], ".php");
devolverá el nombre de la carpeta si el enlace es del formulariohttp://example.com/somefolder
. Mientrasbasename($_SERVER['PHP_SELF'], ".php");
que siempre devolverá el nombre del script, en este casoindex
.Esto podría ayudar:
funcionará incluso si está utilizando include.
fuente
.php
al final del que el OP estaba tratando de deshacersebasename($_SERVER['PHP_SELF'], ".php");
La respuesta de alex es correcta, pero también podría hacerlo sin expresiones regulares como esta:
fuente
hey.php-i-am-a-weird-filename.php
.Aquí hay una lista de lo que encontré recientemente buscando una respuesta:
No olvides eliminar :)
fuente
index.php
incluye loheader.php
que a su vez incluyefunctions.php
, dóndelog_location()
reside. Me llamolog_location()
enheader.php
, y luego corroindex.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)? @begoyanTambién puedes usar esto:
fuente
Una forma más general sería usar pathinfo () . Desde la versión 5.2 es compatible
PATHINFO_FILENAME
.Entonces
también hará lo que necesites.
fuente
$ 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$argv
matriz. A diferencia de todos los demás métodos sugeridos en otras respuestas, este método no requiere el uso debasename()
para eliminar el árbol de directorios. Por ejemplo:echo __FILE__;
devuelve algo como/my/directory/path/my_script.php
echo $argv[0];
devolucionesmy_script.php
fuente
Prueba esto
fuente
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:
Resultado:
fuente
fuente
__FILE__
Utilice ejemplos basados en los resultados del servidor localhost:fuente
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
fuente