- regex — preg_replace удаляет косую черту и после
- Решение
- Другие решения
- Удалить все символы после последнего экземпляра определенного символа
- Решение
- Другие решения
- Решение № 1, используя substr() + strrpos() :
- Решение № 2, используя explode() + implode() :
- Решение № 3, используя preg_replace() :
- NOTA:
- Оригинальный ответ:
- Удалить всё до последнего слеша
- разбор строки(удаление лишних слешей)
regex — preg_replace удаляет косую черту и после
Ну, я хочу удалить слеш и остальную часть URL после доменного имени. в этом коде:
$url = $_POST['url']; $result = preg_replace('#/[^/]*$#', '', $url); echo $result;
он удалит косую черту и после нее (/index.php), но только когда URL будет примерно таким:
или больше косых черт, это только удалит последний косой черты и след (/ тест).
Я хочу удалить первую косую черту после домена:
/ Индекс / тест / тест / тест / тест / тест / тест
Я не знаю, как определить первый слеш после домена и следов.
Вторая проблема, когда URL-адрес:
он удалит /test.com, но я никогда не хочу этого, я хочу, чтобы у URL не было косой черты после доменного имени, НЕ удаляйте вторую косую черту из http: //! ну, я знаю, что я должен определить, что удалить первую косую черту после домена или, с другой стороны, первую косую черту в пути или php self.
Решение
$result = preg_replace('#((?:https?://)?[^/]*)(?:/.*)?$#', '$1', $url);
Это сохранит все, что находится до первой косой черты (после http: //, если присутствует)
Другие решения
$result = preg_replace('%((https?://)?.*?)/.*$%', '$1', $url);
((https?://)?.*?)/.*$Match the regex below and capture its match into backreference number 1 «((https?://)?.*?)» Match the regex below and capture its match into backreference number 2 «(https?://)?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» Match the character string “http” literally «http» Match the character “s” literally «s?» Between zero and one times, as many times as possible, giving back as needed (greedy) «?» Match the character string “://” literally «://» Match any single character that is NOT a line break character «.*?» Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?» Match the character “/” literally «/» Match any single character that is NOT a line break character «.*» Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» Assert position at the end of the string, or before the line break at the end of the string, if any «$» $1 Insert the text that was last matched by capturing group number 1 «$1»
Вы используете не тот инструмент. Это работа для функции parse_url() . Используйте его для разбора URL-адреса на компоненты (схема, пользователь + проход, хост + порт, путь, строка запроса, фрагмент), затем выберите нужные вам фрагменты и соедините их, чтобы получить нужный URL-адрес.
$url = $_POST['url']; // Parse the URL into pieces $pieces = parse_url($url); // Put some of the pieces back together to get a new URL // Scheme ('http://' or 'https://') $newUrl = $pieces['scheme'].'://'; // Username + password, if present if (! empty($pieces['user'])) < $newUrl .= $pieces['user']; if (! empty($pieces['pass'])) < $newUrl .= ':'.$pieces['pass']; >$newUrl .= '@'; > // Hostname $newUrl .= $pieces['host']; // Port, if present if (! empty($pieces['port'])) < $newUrl .= ':'.$pieces['port']; >// That't all. Ignore path, query string and url fragment echo($newUrl);
В качестве примечания, составная часть может быть легко выполнена с помощью функции http_build_url () ; к сожалению, эта функция обеспечивается Расширение HTTP который не в комплекте с PHP . Он должен быть установлен отдельно, что означает, что если код не размещен на вашем собственном сервере, он, скорее всего, недоступен.
Удалить все символы после последнего экземпляра определенного символа
Как я могу удалить все содержимое строки после последнего появления символа косой черты / ?
Например, строка выглядит так:
http://localhost/new-123-rugby/competition.php?croncode=12345678
Я хочу удалить весь контент после последнего / так что это просто показывает:
Но содержание после / может быть переменной длины.
Обратите внимание, что в URL может быть любое количество слешей. Он должен быть в состоянии удалить контент после последней косой черты. Там может быть больше, чем показано в примере выше.
Решение
ты можешь попробовать это
$url = "http://localhost/new-123-rugby/competition.php?croncode=12345678"; preg_match("/[^\/]+$/", $url, $matches); $newUrl = str_replace($matches[0],'',$url); echo $newUrl;
Другие решения
Решение № 1, используя substr() + strrpos() :
$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678'; $pos = strrpos($string, '/'); if ($pos !== FALSE)
функция strrpos() находит положение прошлой появление / в строке, substr() извлекает необходимую подстроку.
недостаток: если $string не содержит ‘/’ , strrpos() возвращается FALSE а также substr() не возвращает то, что мы хотим. Необходимо проверить значение, возвращаемое strrpos() первый.
Решение № 2, используя explode() + implode() :
$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678'; $array = explode('/', $string); if (count($array) > 1) < array_pop($array); // ignore the returned value, we don't need it echo(implode('/', $array).'/'); // join the pieces back, add the last '/' >
В качестве альтернативы вместо array_pop($array) мы можем сделать последний компонент пустым, и нет необходимости добавлять дополнительные ‘/’ в конце:
$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678'; $array = explode('/', $string); if (count($array) > 1) < $array[count($array) - 1] = ''; // empty the last component echo(implode('/', $array)); // join the pieces back >
недостаток (для обеих версий): если $string не содержит ‘/’ , explode() создает массив, содержащий одно значение, а остальная часть кода производит либо ‘/’ (первый кусок кода) или пустая строка (вторая). Необходимо проверить количество элементов в массиве, произведенном explode() ,
Решение № 3, используя preg_replace() :
$string = 'http://localhost/new-123-rugby/competition.php?croncode=12345678'; echo(preg_replace('#/[^/]*$#', '/', $string));
Недостатки: никто. Это хорошо работает, когда оба, когда $string содержит ‘/’ и не содержит ‘/’ (это не меняет $string в этом случае).
NOTA:
Вопрос был отредактирован таким образом, чтобы исходный ответ (под правкой) не соответствовал требованиям ОП. Он не был помечен как правка из OP.
РЕДАКТИРОВАТЬ:
Обновил мой ответ, чтобы он теперь соответствовал требованиям ОП:
(Теперь он работает с таким количеством слешей, как вы хотите)
Также будет работать с использованием
http://localhost/new-123-rugby////////competition.php?croncode=12345678
Оригинальный ответ:
Это должно работать для вас:
Удалить всё до последнего слеша
Добрый вечер, подскажите пожалуйста как можно удалить всё с текста до последнего слеша ?
например, есть текст: /dir/dir2/file.rar
в результате работы данного скрипта, от текста остаётся только: /dir/dir2/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
function del_last_sheet($str){ $str2=explode("/", $str); $str3=$str2[0]; $leng=count($str2)-1; if(!$str2[$leng]){ $str2[$leng-1]=NULL; } for($i=1;$i$leng;$i++){ $str3=$str3."/".$str2[$i]; } if($str2[$leng]){ $str3=$str3."/"; } return $str3; } echo del_last_sheet("/dir/dir2/file.rar"); ?>
а как можно изменить его для удаления всего всего до последнего слеша, т.е. должно ост. только: file.rar
Удалить всё до последнего слеша
У меня есть textBox1.Text = "C:\Windows\Explorer.EXE" При нажатии на баттон как удалить.
Удалить все символы в строке до самого последнего слеша
Есть строка с текстом "https://www.cyberforum.ru/images/cyberforum_logo.jpg" и мне надо удалить.
Получить из строки url все до последнего слеша
Приветствую! Встал что-то на простом моменте, но никак не пойму, как решить. Если регуляркой.
Удалить из ссылки все после четвертого слеша
вообще такая ситуация нужно удалить в ссылке например http://www.f.com/vid/197/m-e/?utm все после.
разбор строки(удаление лишних слешей)
Удаление лишних тикетов
Здравствуйте, передо мной стоит такая задача: Человек может отправлять тикеты в тех.
Обрезание строки без лишних символов
И снова вынужден обратиться за помощью. Есть такая задача, обрезать строку до определённой длины.
Удаление лишних слов из строки
Здравствуйте! Есть программа удаления лишних пробелов из строки. Она выглядит так: #include.
$str="T:/home//localhost///MyScripts/////"; $pos=strpos($str,"//"); while($pos!=false) { $str=str_replace("//","/",$str); $pos=strpos($str,"//"); } // str=T:/home/localhost/MyScripts/
а если нужно получить из этой строки: $path = «T:/home/localhost/MyScripts/FileManager1.0»
вот это $last_dir = «/FileManager1.0»
то можно сделать это:
$path = "T:/home/localhost/MyScripts/FileManager1.0" $i = 1; while($symbol != '/') { $symbol = $path{strlen($path) - $i}; $last_dir = $symbol.$last_dir; $i++; }
Сообщение от Sulik78
спасибо! а как можно с задачей, которая выше справиться лучше, где нужно имя папки достать до первого слеша с конца?
попробуй
вроде так
только думаю правильнее по логике это использовать после первого кода
когда уже осталось по одному слэшу
$dirName = preg_replace("/(.*)\/(.*)\/(.*)/", '\\2', $string);
Сообщение от Sulik78
попробуй
вроде так
только думаю правильнее по логике это использовать после первого кода
когда уже осталось по одному слэшу
ну я это и предпологал сделать.
Добавлено через 7 минут
Сообщение от Sulik78
попробуй
вроде так
только думаю правильнее по логике это использовать после первого кода
когда уже осталось по одному слэшу
$dirName = preg_replace("/(.*)\/(.*)\/(.*)/", '\\2', $string);
$path = "T:/home/localhost/MyScripts/FileManager1.0"; $dirName = preg_replace("/(.*)\/(.*)\/(.*)/", '\\2', $path);
$path = "T:/home/localhost/MyScripts/FileManager1.0";
т.е на конце строки я слеш убираю, а в $dirName, мне нужно чтобы было имя папки со слешем перед именем.
Добавлено через 1 минуту
и еще я в строке убираю последний слеш так:
if ($path{strlen($path) - 1} == "/") { $path = substr($path, 0, strlen($path) - 1); }
Сообщение от blackbanny
нужно чтобы выдавало
Код PHP
1
$dirName = «/FileManager1.0»;
т.е на конце строки я слеш убираю, а в $dirName, мне нужно чтобы было имя папки со слешем перед именем.
я подумал что FileManager1.0 это уже файл )
$dirName = preg_replace("/(.*)\/(.*)/", '\\2', $string);
Добавлено через 2 минуты
blackbanny, ты дай строку полностью в какой искать
и кусок что ты там хочешь вырезать
так будет понятнее
Добавлено через 11 секунд
blackbanny, ты дай строку полностью в какой искать
и кусок что ты там хочешь вырезать
так будет понятнее
Сообщение от Sulik78
blackbanny, ты дай строку полностью в какой искать
и кусок что ты там хочешь вырезать
так будет понятнее
вообщем есть такая строка $path = «T:\\\\home\localhost\\\MyScripts\\FileManager1.0\\\»
сначала заменяем ‘\’ на ‘/’ : $path = str_replace(«\\», «/», $path);
получается: $path = «T:////home/localhost///MyScripts//FileManager1.0///»
потом оставляем только по одной ‘/’ : $path = preg_replace(«/\/\/+/»,»/», $path);
получается: $path = «T:/home/localhost/MyScripts/FileManager1.0/»
потом нужно проверить, есть ли на конце строки ‘/’ если есть, то верезать(как сделать?)
на выходе должно получится: $path = «T:/home/localhost/MyScripts/FileManager1.0»
потом нужно получить имя последней директории со слешем(как сделать?), т.е. $last_dir = «/FileManager1.0»
потом я получаю путь к родительской директории: $path_prev_dir = str_replace($last_dir, «», $path);
получается: $path_prev_dir = «T:/home/localhost/MyScripts»
1 2 3 4 5 6 7 8 9 10 11 12
$string = "T:\\\\home\localhost\\\MyScripts\\FileManager1.0\\\ "; $match = array("/\\\\+/", "/(.*)[\/]/"); $repl = array("/", "\\1"); $fullPath = preg_replace($match, $repl, $string); $prevPath = preg_replace("/(.*)\/.*/", '$1', $fullPath); $endPath = preg_replace("/.*\/(.*)/", '/$1', $fullPath); echo $fullPath; echo $prevPath; echo $endPath;
T:/home/localhost/MyScripts/FileManager1.0
T:/home/localhost/MyScripts
/FileManager1.0
все таки один вопрос остался, как сделать так чтобы если есть на конце слеш, то мы его удаляем, если нет, то ничего не делаем, т.е. могут быть такие строчки:
T:/home/localhost/LearnPhp — здесь ничего не делаем
или
T:/home/localhost/LearnPhp/ — а здесь удаляем слешь
if ($path{strlen($path) - 1} == "/") { $path = substr($path, 0, strlen($path) - 1); }
$match = array("/\\\\+/", "/(.*)[\/]/", '/[\/]$/'); $repl = array("/", "\\1", "");
Удаление лишних пробелов из строки
Допустим дана строка :" ФЫвфвфв фывфывф фывфв фывфывфыв asasawq" Нужно что бы.
Удаление лишних символов из строки
Подскажите, пожалуйста. Скажем, есть строка "1МоскваФирма ЭКО23.12.2014Иванов И. И.". Как.
Удаление лишних пробелов в середине строки
Я написал как мог, всё работает, но если вы знаете как упростить код и написать более проще, то.