У меня есть такая строка 300.300.300.220:/var/lib/test/data/source/file.txt Мне нужно вырезать файл и оставить остальное, но строка может измениться, даже txt может измениться на другую вещь, например ini . Я изучил substr и str_split , но не могу понять, как это сделать. Есть идеи о том, как этого добиться? Я рассказывал о цикле, но не могу понять, как это сделать. РЕДАКТИРОВАТЬ: Я хочу заменить файл строкой. Таким образом, желаемый результат будет 00.300.300.220:/var/lib/test/data/source/mystring.txt

php
-1
alexis 1 Июл 2021 в 18:15

4 ответа

Лучший ответ

В PHP есть pathInfo функция, которая выполняет большую часть работа для вас, чтобы разобрать имя файла / расширение. Затем вы можете снова объединить путь с новым именем файла:

<?php

function replaceFileName($input, $newFileName) {
    $info = pathInfo($input);
    return $info['dirname'] . DIRECTORY_SEPARATOR . $newFileName . '.' . $info['extension'];
}

$test = "300.300.300.220:/var/lib/test/data/source/file.txt";
var_dump(replaceFileName($test, 'testing'));
// string(53) "300.300.300.220:/var/lib/test/data/source/testing.txt" 

Пример на https://3v4l.org/TGi4X

var_dump($info) покажет вам, как был проанализирован путь:

array(4) {
  ["dirname"]=>
  string(41) "300.300.300.220:/var/lib/test/data/source"
  ["basename"]=>
  string(8) "file.txt"
  ["extension"]=>
  string(3) "txt"
  ["filename"]=>
  string(4) "file"
}

Этот метод предпочтительнее использования str_replace в случае, если ваш путь содержит имя файла в качестве других частей пути (крайний пример: /txt/txt/txt/txt.txt).

<?php

$test = "/txt/txt/txt/txt.txt";
var_dump(replaceFileName($test, 'testing'));

Правильно возвращает: string(28) "/txt/txt/txt/testing.txt"

Пример на https://3v4l.org/B192t

0
WOUNDEDStevenJones 1 Июл 2021 в 16:43

Вы можете использовать функцию explode (), таким образом ваша строка будет быть массивом, а затем вы можете манипулировать, как хотите

$string = "/data/source/file.txt";
$explode = explode("/", $string)
0
Gabriele Carbonai 1 Июл 2021 в 15:18

Если под «вырезать файл» вы подразумеваете удаление всего, что находится после символа :, то вы можете использовать explode, как упомянула Габриэле.

В вашем случае это будет выглядеть так:

$string = '300.300.300.220:/var/lib/test/data/source/file.txt';
$parts = explode(':', $string);

echo $parts[0]; // 3000.300.300.220
echo $parts[1]; // /var/lib/test/data/source/file.tx
0
Romi Halasz 1 Июл 2021 в 15:23
$filePath = "300.300.300.220:/var/lib/test/data/source/file.txt";
$mySting = 'myString';

Первый способ:

$fileName = basename($filePath); # file.txt
$fileExtension = pathinfo($fileName, PATHINFO_EXTENSION); # txt
$newFileName = "{$mySting}.{$fileExtension}"; # myString.txt
$result = str_replace($fileName, $newFileName, $filePath); # 300.300.300.220:/var/lib/test/data/source/myString.txt

Второй способ:

$result = explode('/', $filePath); # Array
$fileName = array_pop($result); # file.txt
$fileExtension = pathinfo($fileName, PATHINFO_EXTENSION); # txt
$newFileName = "{$mySting}.{$fileExtension}"; # myString.txt
$result = implode('/', $result); # 300.300.300.220:/var/lib/test/data/source  
$newFilePath = "{$result}/{$newFileName}"; # 300.300.300.220:/var/lib/test/data/source/myString.txt

Есть и другие способы

0
Erfan Bahramali 1 Июл 2021 в 15:34