[PHP] map naam opvragen

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moet de exacte naam hebben van de map waarin een bestand zich bevind. Dus stel het bestand zit in de map '/test/', dan moet ik 'test' zien te krijgen in een variabele in dat bestand.

Ik heb al flink gezocht, maar niks goeds gevonden. Ik ben al zo ver dat ik het volledige pad op kan vragen met getcwd(), ik heb hier ook allerlei varianten op gevonden, maar allemaal produceren ze dit:

'/home/mijngebruikersnaam/public_html/website/test'

Is er een functie die me alleen de naam van de huidige map kan geven, of is er een manier op alleen de laatste directory uit het volledige pad te splitsen?

Misschien is het heel simpel, maar ik ben al vrij lang bezig vandaag, dus misschien zie ik het over het hoofd.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op dinsdag 15 augustus 2006 @ 23:17:
Misschien is het heel simpel, maar ik ben al vrij lang bezig vandaag, dus misschien zie ik het over het hoofd.
er zijn vele wegen die naar rome leiden...

je zou bijvoobeeld die string kunnen splitten (explode) op een slash en dan het laatste item uit die array nemen?

Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Zoek eens op strpos en substr, dit is wel heel basic PHP. :)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • Rigi
  • Registratie: September 2001
  • Laatst online: 30-11-2018
En als je nou gewoon het laatste stukje pakt van die sting? gewoon de laatste '/' opzoeken en alles wat erna komt als map pakken. Of is dat geen optie?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
substr heeft geleid tot een werkende oplossing, bedankt!

en ik vind dat trouwens niet zo basic PHP.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op dinsdag 15 augustus 2006 @ 23:35:
substr heeft geleid tot een werkende oplossing, bedankt!

en ik vind dat trouwens niet zo basic PHP.
nee klopt, dit is basic programmeren ;)

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Ik zou willen adviseren om toch terug te vallen op split! Zelf werken met substr, strpos betekent namelijk dat je veel error handling moet inbouwen ... als je begint met programmeren ga je hier veel tijd aan verliezen ...

http://nl3.php.net/manual/en/function.split.php

Zal iets worden van:
PHP:
1
2
$saPathNames = split( "/", $sPathName );
$sCurrentDir = $saPathNames[sizeof($saPathNames)-1]; // =end($saPathNames)


edit: explode() mag ook ... split is iets krachtiger.

[ Voor 17% gewijzigd door hamsteg op 16-08-2006 08:42 . Reden: Escapen ?--> hoeft niet ]

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je toch geen echte regex functionaliteit wil gebruiken in het 1e argument van split kan je natuurlijk gewoon explode() gebruiken. ;)

[ Voor 15% gewijzigd door Voutloos op 16-08-2006 08:38 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hamsteggot schreef op woensdag 16 augustus 2006 @ 08:33:
Ik zou willen adviseren om toch terug te vallen op split! Zelf werken met substr, strpos betekent namelijk dat je veel error handling moet inbouwen ... als je begint met programmeren ga je hier veel tijd aan verliezen ...

http://nl3.php.net/manual/en/function.split.php

Zal iets worden van:
PHP:
1
2
$saPathNames = split( "\/", $sPathName ); // moet je '/' escapen met '\/' ... weet even niet
$sCurrentDir = $saPathNames[sizeof($saPathNames)-1];
ik zou het met explode doen, is wat sneller, je hebt immers geen regex nodig hiervoor :)

PHP:
1
2
$saPathNames = explode( "/", $sPathName );
$cCurrentDir = end($saPathNames);

Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

PHP:
1
2
3
//misschien eerst het bestand wegknippen, dus / zoeken op laatste voorkomen en met substr er daarna afknippen. hoe staat hierboven volgens mij :)
$aPathName = explode("/", "/var/www/test");
$sLastMap = $aPathName[count($aPathName) - 1];

Omdat je bestands en map name geen / mogen bevatten is dit redelijk waterdicht

edit:
@hierboven:
Heb je dat gekopieerd van me :+ ?

[ Voor 7% gewijzigd door DDemolition op 16-08-2006 08:42 ]

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

@Erkens, nooit aan gedacht om end() op die manier te gebruiken ... deed ik alleen bij echt doorlopen van een array met reset/next/previous ... weer wat geleerd.

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Waarom niet gewoon de Filesystem Functions gebruiken?

Zoals dirname() en basename().

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

BHR schreef op woensdag 16 augustus 2006 @ 08:48:
Waarom niet gewoon de Filesystem Functions gebruiken?

Zoals dirname() en basename().
van PHP.net:
PHP:
1
dirname('/usr/local/magic/bin');
Text output:
1
returns '/usr/local/magic'  and not just 'magic'

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

hamsteggot schreef op woensdag 16 augustus 2006 @ 08:55:
[...]

van PHP.net:
PHP:
1
dirname('/usr/local/magic/bin');
Text output:
1
returns '/usr/local/magic'  and not just 'magic'
En dit is te ingewikkeld :+ ?
PHP:
1
echo basename(dirname($path));

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Dit is inderdaad te ingewikkeld en onjuist gebruik van de functie basename, verder zul je zeer waarschijnlijk de laatste '/' er eerst moeten afsnoepen. Alles mag natuurlijk maar dit ligt niet in de verwachting van de output van de functie en kan dus onduidelijkheid veroorzaken.

www.php.net: basename -- Returns filename component of path

Je kunt ook vracht vervoeren in een Ferrari ... mag en kan maar zal niet vaak voorkomen, daarvoor heeft men vrachtwagens uitgevonden. Functies moet je gebruiken waarvoor ze bedoeld zijn en niet misbruiken.

[ Voor 6% gewijzigd door hamsteg op 16-08-2006 09:34 ]

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Eh, wát is precies het misbruik hier?
Returns filename component of path
Ook de directory naam zelf valt onder het filename component. Of een logische naam uiteindelijk een directory of file is, daar heb je de is_file() en is_directory() functies voor.

FYI: Er is natuurlijk ook nog de mooie pathinfo functie!

IMO is juist het steeds opnieuw schrijven van path parse functies een 'misbruik'. Alleen al omdat deze (meestal) niet portable is over linux en windows (for those who care ;) ).


Dat je eigenlijk al weet dat het de parent van een file een directory is, doet daar niks aan af. Deze zekerheid kun je vervolgens zelf gebruiken om geen is_directory() call te doen (wat een daadwerkelijke stat() aanroep op het filesysteem voorkomt), want dat weet je immers al.

[ Voor 0% gewijzigd door BHR op 16-08-2006 10:02 . Reden: wat nuance aanbrengen ]

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Je kunt recht praten wat krom is maar de betekenis van basename is een filename met eventueel een extentie NIET een directory entry. Ook de pathinfo functie zegt dit. De betekenis van directory is alles wat nodig is om bij een basename te geraken. Dat jij nu toevallig snel met de functie basename de laatste directory kunt pakken, zal ik niet ontkennen, maar wat je krijgt is geen basename volgens de PHP definitie. Misschien kunnen we ook wel met de date() functie hetzelfde bereiken, zou het dan ook logisch zijn?

Als jij alleen software voor jezelf schrijft ... leef je uit ... ik ga je echt niet tegenhouden maar als een ander dit leest raakt die wel van de leg. De verwachting klopt niet meer.

De opmerking van herschrijven snap ik niet. De functies explode/split zijn dermate elementair dat het onzin is om nog een library functie te hebben die uit een directory alle enkelvoudige stappen haalt ...maar dien een voorstel in bij PHP.source sou ik zeggen. Oh, voor compatibiliteit moet de pattern van split worden veranderd naar "[\\/]" (explode werkt dan niet meer).

Leef je uit, ik stop de discussie.

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Eh, nee. Jij haalt de betekenis van basename en filename door de war.

basename != filename

Dat een filename (bijna?) altijd een basename is, betekent niet dat dit ook de andere kant op geldt.
Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
C:\>php -v
PHP 5.1.2 (cli) (built: Jan 11 2006 16:40:00)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

C:\>php -r "print_r(pathinfo('C:\\windows\\system32'));"
Array
(
    [dirname] => C:\windows
    [basename] => system32
)

C:\>php -r "print_r(pathinfo('C:\\windows\\system32\\'));"
Array
(
    [dirname] => C:\windows
    [basename] => system32
)

C:\>php -r "print_r(pathinfo('C:\\windows\\system32\\test.not-existing'));"
Array
(
    [dirname] => C:\windows\system32
    [basename] => test.not-existing
    [extension] => not-existing
)

Hetzelfde geldt voor dirname en basename.


Dat de werking van deze functies niet met JOU verwachting overeenkomt, dan wil ik wel graag weten wat jou verwachting wel is. Ik ben nooit te beroerd om iets nieuws te leren.


En het gebruiken van filesystem functies voor bewerkingen op bestanden en directories zelf en/of op de logische namen ervan vind ik heel logisch.
De betekenis van directory is alles wat nodig is om bij een basename te geraken
maar wat je krijgt is geen basename volgens de PHP definitie
Ik ben heel benieuwd naar deze definities, bron?

Het verzoek aan php.source laat ik aan jou over, jij vind deze functies immers onzin. Ik vind ze zeer handig.

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

Verwijderd

Heb zelf wel al eens iets gemaakt, dan kon je de filenaam van bijv een php file naam omzetten uit de url

Bij http://urlnaarserver.nl/file.php word dan omgezet naar File
Dus change and try :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function locatie_in_titel() {

  // Locatie ophalen
  $lo = getenv("REQUEST_URI");

  // die '/' aan het begin weghalen
  $lo = substr($lo, 1);

  // .php eraf halen
  $lo = substr($lo, -0, -4);

  // eerste letter een hoofdletter maken
  $lo = ucfirst(strtolower($lo));

  // Rare tekens uit de titel halen
  // Zelf kun je nog teken toevoegen door midden van:
  //   $lo = str_replace("-", " ", $lo); aan ta passen
  $lo = str_replace("-", " ", $lo);

  return $lo;

}
Pagina: 1