Geçerli komut dosyası adını al


273

PHP betiğim varsa, bu betiğin içinden dosya adını nasıl alabilirim?

Ayrıca, formun bir komut dosyasının adı verildiğinde, jquery.js.phpyalnızca "jquery.js" bölümünü nasıl ayıklayabilirim?


1
Bu bir soruda iki soru. Hangisini bilmek istiyorsun. Geçerli komut dosyasının adını nasıl söyleyebilirim, uzantıyı bir dosya adından veya her ikisinden nasıl kesebilirim?
Pekka

3
Kelime also, ek bir soru sorduğunuzu gösterir. Sheesh. Bazı çocuklar gözetliyor.
digiscripter

Yanıtlar:


411

Geçerli dosya adını almak için sadece PHP sihirli sabitini __FILE__ kullanın.

Ama öyle görünmek istemiyorsun .php. Yani...

basename(__FILE__, '.php'); 

Daha genel bir dosya uzantısı sökücü şöyle görünecektir ...

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"

Standart dize kitaplığı işlevlerini kullanmak , beklediğiniz gibi çok daha hızlıdır .

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

1
Neden sadece kullanım substrve strrchrson sökmek için .ve bunun arkasında her şey?
ThiefMaster

9
@ThiefMaster Çünkü dosya uzantılarını işlemek için PHP içinde yerleşik bir şey var. Tekerlek var ve iyi yuvarlanıyor.
alex

2
Ancak normal ifade daha pahalı olabilir!
ThiefMaster

14
Bu satırın içinde __FILE__bulunduğu .phpdosyayı verirken , aslında $_SERVER['SCRIPT_NAME']şu anda çalışan üst düzey komut dosyasını (web sunucusu tarafından veya doğrudan komut satırında çağrılmış olan) istiyorsanız
Drew Stephens

2
@ Sanırım bu gerçekten ne istediğine bağlı.
alex

125

Eklemenizin hangi dosyada olduğunu (yani gerçekten hangi komut dosyası adının istendiğini) bilmesini istiyorsanız, şunu kullanın:

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

Çünkü bir dosyaya yazarken genellikle adını biliyorsunuzdur.

Edit: Alec Teal tarafından belirtildiği gibi, semboller kullanırsanız bunun yerine sembolik adını gösterecektir.


4
Bu bana yardımcı oldu)) komut dosyası adı, gerekli dosya almak için gerekli )
Denys Klymenko

4
Bu yanlış, gerçek PHP dosyasını almaz, ancak web sunucusunun isteği çözdüğü dosya. Eğer simlink kullanıyorsanız farklıdır.
Alec Teal

PHP-FPM kullanıyorsanız da farklıdır.
Andrew Ensley

Ayrıca, uzantıya da ihtiyacınız varsa,pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd
Uzantıya


56

İşte basename(__FILE__, ".php")ve arasındaki fark basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")bu kodun dahil edildiği dosyanın adını gösterir - Bu kodu header.php dosyasına eklerseniz ve geçerli sayfa index.php ise , index değil üstbilgiyi döndüreceği anlamına gelir .

basename($_SERVER["REQUEST_URI"], ".php")- Bu kodu header.php dosyasına dahil ederseniz ve geçerli sayfa index.php ise , başlık değil dizin döndürür .


hangisi daha güvenli SCRIPT_FILENAMEveya REQUEST_URI? İkisi de sunucu vars ama biliyorum REQUEST_URIbir kullanıcı kurcalanmış değeri değil mi? "URI enjeksiyonu" tehdidini mümkün kılar
SparK

1
her ikisinin de kendi iktidarsızlığı var, ancak mysql_real_escape_string, stripslashes
vb.Gibi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");, bağlantı formdaysa klasörün adını döndürür http://example.com/somefolder. Iken basename($_SERVER['PHP_SELF'], ".php");her zaman komut dosyasının adını döndürür, bu durumda index.
katalin_2003

27

Bu yardımcı olabilir:

basename($_SERVER['PHP_SELF'])

İçerme özelliğini kullanıyor olsanız bile çalışır.


Bu hala .phpOP'nin kurtulmaya çalıştığı sonunda
Brian Leishman

3
@stumpx Sonra yapabilirsinizbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Ben 2 dosya, header.php ve home.php var header.php i vb bazı afiş değiştirebilir böylece geçerli sayfa home.php veya contact.php olduğunu başlığında algılayabilir nasıl home.php denir
Moxet Khan

19

alex'in cevabı doğrudur, ancak bunu normal ifadeler olmadan da yapabilirsiniz:

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

6
Bu, bir dosya adını değiştirme riskini taşır hey.php-i-am-a-weird-filename.php.
alex

Bunu zaten düşündüm ama soruda belirtilen tek sayfa için kullandıklarını düşündüm. ".Php" ifadesinin dizenin sonunda olup olmadığını da kontrol edebilirsiniz. Sorunuzun yanlış olduğunu söylememek, ancak düzenli baskılar eşek için bir acı olabilir ve genellikle çok daha basit ve daha az kaynak yoğun bir yöntemin kullanılabileceği senaryolarda kullanılır.
kullanıcı

Shofner Bazı testler yaptım ve yolunuz yaklaşık iki kat daha hızlı çalışıyor, ancak yine de 1000'den fazla yineleme farkı 0.003231 mikrosaniye.
alex

16

İşte son zamanlarda bir cevap ararken bulduğum bir liste:

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

Kaldırmayı unutmayın :)

<br>


1
Yani ... SCRIPT_NAME, SCRIPT_FILENAME ve PHP_SELF 3 farklı şey, değil mi? (Neden aynı değere sahip bu kadar çok var ?! Rasmus kesin olarak uyuşturucu kullanıyordu)
SparK

Senaryo: index.phpiçerir header.phpsırayla içeren functions.php, nerede log_location()bulunduğu. Ben buna log_location()içinde header.php, sonra çalıştırın index.php. Yukarıdaki işlevlerin tümü, işlevi veya dizini veya etki alanını veya bunların bazı varyasyonlarını yazdırır. Hangi PHP betiğinin işlevi çağırdığını bilmek istemiyorum. Tek bir hatta bile mümkün mü? @begoyan
s3c

6

bunu da kullanabilirsiniz:

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

4

Daha genel bir yol pathinfo () kullanmak olabilir . Sürüm 5.2'den beriPATHINFO_FILENAME .

Yani

pathinfo(__FILE__,PATHINFO_FILENAME)

ayrıca ihtiyacınız olanı yapacak.


2

$ Argv [0]

Kullanımı çok daha kolay buldum $argv[0]. Yürütme komut dosyasının adı her zaman $argvdizideki ilk öğedir . Diğer yanıtlarda önerilen diğer tüm yöntemlerin aksine, bu yöntem basename()dizin ağacını kaldırmak için kullanılmasını gerektirmez . Örneğin:

  • echo __FILE__; gibi bir şey döndürür /my/directory/path/my_script.php

  • echo $argv[0]; İadeler my_script.php



2

Bu, dahil bir PHP dosyasının içinde çalıştırıldığında bile çalışır ve geçerli php dosyasının dosya adını çalıştırmak istiyorsanız:

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

Sonuç:

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__ localhost sunucu sonuçlarına dayalı örnekler kullanın:

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

Bazı dediği gibi basename($_SERVER["SCRIPT_FILENAME"], '.php')ve basename( __FILE__, '.php')bu sınamak için iyi bir yoldur.

Benim için yaptığım bazı doğrulama talimatları için çözüm benim için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.