PHP strrchr найти ближайший к последнему, а не последнее вхождение - PullRequest
0 голосов
/ 20 марта 2011

Я использовал функцию PHP strrchr с substr и strrpos , чтобы найти имя файла в строке с полным путем, например:

/ images / onepiece.jpg возвращает onepiece.jpg

, но теперь мне нужна функция, чтобы найти не последний "/", а следующий за последним: /images/anime/onepiece.jpg возвращая аниме / onepiece.jpg или / аниме / onepiece.jpg А так как strrchr - 1 нетработать, хе-хе :), как мне этого добиться?

[решено] Используя PHP pathinfo (), как @middaparka и @Shakti Singh сказали: я изменил способ получения строки изображения из базы данных MySQL,Теперь у него могут быть подпапки, как и было в моем первоначальном намерении.

<?php
/*
 * pathinfo() parameters:
 * PATHINFO_DIRNAME = 1
 * PATHINFO_BASENAME = 2
 * PATHINFO_EXTENSION = 4
 * PATHINFO_FILENAME = 8
 * */
    $slash = '/';
    $mainpath = 'store/image/';
    $thumbspath = 'cache/';
    $path = $imgsrow->photo; //gets the string containing the partial path and the name of the file from the database
    $dirname = pathinfo($path, 1); //gets the partial directory string
    $basename = pathinfo($path, 2); //gets the name of the file with the extension
    $extension = pathinfo($path, 4); //gets the extension of the file
    $filename = pathinfo($path, 8); //gets the name of the file
    $dims = '-100x100.'; //string of size of the file to append to the file name
    $image = $mainpath . $path; //mainpath + path is the full string for the original/full size file
    $thumbs = $mainpath . $thumbspath . $dirname . $slash . $filename . $dims . $extension; //string to point to the thumb image generated from the full size file
?>
    <img src="<?= $thumbs; ?>" width="100" height="100" alt="<?= $row->description; ?>" />
    <br />
    <img src="<?= $image; ?>" width="500" height="500" alt="<?= $row->description; ?>" />

Ответы [ 4 ]

1 голос
/ 20 марта 2011

Я бы предложил использовать explode, чтобы разбить путь на его сегменты:

$segments = explode('/', $path);

Затем вы можете использовать $segments[count($segments)-1], чтобы получить последний сегмент пути.

И для последних двух сегментов вы можете использовать array_slice с implode, чтобы соединить их вместе:

$lastTwoSegments = implode('/', array_slice($segments, -2));
1 голос
/ 20 марта 2011

Честно говоря, было бы намного проще использовать функции pathinfo или dirname для разложения путей к каталогам.

Например:

$filename = pathinfo('/images/onepiece.jpg', PATHINFO_BASENAME);
$directory = dirname('/images/onepiece.jpg');

Возможно, вам придется использовать их сочетание, чтобы получить то, что вам нужно, но они, по крайней мере, будут "безопасны" для ОС (т. Е. Будут обрабатывать стили пути Linux / Linux и Windows).

С точки зрения конкретной проблемы, которую вы имеете, вы сможете использовать следующее кроссплатформенное решение, чтобы получить то, что вам нужно:

<?php
    $sourcePath = '/images/anime/onepiece.jpg';

    $filename = pathinfo($sourcePath, PATHINFO_BASENAME);
    $directories = explode(DIRECTORY_SEPARATOR, pathinfo($sourcePath, PATHINFO_DIRNAME));

    echo $directories[count($directories) -1] . DIRECTORY_SEPARATOR . $filename;
?>
0 голосов
/ 20 марта 2011

Чувак, просто сделай временную строку для хранения строки, которую ты хочешь найти.Найдите последнее вхождение, замените его чем-нибудь, например, x, а затем найдите новое последнее вхождение, которое является вторым по последнему вхождению.

0 голосов
/ 20 марта 2011

вам нужно использовать pathinfo function

pathinfo ($path, PATHINFO_FILENAME );
...