Регулярное выражение, чтобы собрать все после последнего / - PullRequest
50 голосов
/ 19 июля 2009

Я новичок в регулярных выражениях и задаюсь вопросом, как сформулировать фразу, которая собирает все после последней /.

Я извлекаю идентификатор, используемый Google GData.

мой пример строки

http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123

Где идентификатор: p1f3JYcCu_cb0i0JYuCu123

О, и я использую PHP.

Ответы [ 8 ]

102 голосов
/ 19 июля 2009

Это соответствует как минимум одному из (что-либо, кроме слэша), за которым следует конец строки:

[^/]+$


Примечания:

  • Никаких паренов, потому что не нужны никакие группы - результат попадает в группу 0 (само совпадение).
  • Использует + (вместо *), поэтому, если последний символ является косой чертой, он не может соответствовать (а не совпадает с пустой строкой).


Но, скорее всего, более быстрое и простое решение заключается в использовании встроенной функции обработки списка строк вашего языка - т.е. ListLast( Text , '/' ) или эквивалентной функции.

Для PHP ближайшая функция - strrchr , которая работает следующим образом:

strrchr( Text , '/' )

Сюда входит косая черта в результатах - согласно комментарию Тедди ниже, вы можете удалить косую черту с помощью substr :

substr( strrchr( Text, '/' ), 1 );
18 голосов
/ 19 июля 2009

В целом:

/([^/]*)$

Данные, которые вы хотите, будут соответствовать первой группе.


Редактировать Поскольку вы используете PHP, вы также можете использовать strrchr, который возвращает все от последнего вхождения символа в строке до конца. Или вы можете использовать комбинацию strrpos и substr, сначала найти позицию последнего вхождения, а затем получить подстроку из этой позиции до конца. Или explode и array_pop, разделите строку на / и получите только последнюю часть.

12 голосов
/ 20 июля 2009

Вы также можете получить «имя файла» или последнюю часть с помощью функции basename .

<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"

На моем ящике я мог просто передать полный URL. Возможно, вам придется снять http:/ спереди.

Basename и dirname отлично подходят для перемещения по всему, что выглядит как путь к файлу Unix.

8 голосов
/ 19 июля 2009
/^.*\/(.*)$/

^ = начало строки

.*\/ = жадное совпадение с последним вхождением в / из начала строки

(.*) = группа всего, что приходит после последнего вхождения /

3 голосов
/ 20 июля 2009

Вы также можете нормальное разделение строк

$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
2 голосов
/ 19 июля 2009

Этот шаблон не будет захватывать последний слеш в $0, и он не будет ничего совпадать, если после последнего слеша нет символов.

/(?<=\/)([^\/]+)$/

Редактировать: но он требует просмотра назад, не поддерживается ECMAScript (Javascript, Actionscript), Ruby или несколькими другими разновидностями . Если вы используете один из этих ароматов, вы можете использовать:

/\/([^\/]+)$/

Но будет захватывать последний слеш в $0.

1 голос
/ 19 июля 2009

Не программист PHP, но strrpos кажется более перспективным местом для начала. Найдите самый правый «/», и все, что вы искали, в прошлом. Регулярное выражение не используется.

Найти позицию последнего появления символа в строке

0 голосов
/ 01 сентября 2017

на основе @ Марк Рушаков ответит лучшее решение для разных случаев:

<?php
$path = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123?var1&var2#hash";
$vars =strrchr($path, "?"); // ?asd=qwe&stuff#hash
var_dump(preg_replace('/'. preg_quote($vars, '/') . '$/', '', basename($path))); // test.png
?>
  1. Регулярное выражение для сбора всего после последнего /
  2. Как получить имя файла из полного пути с помощью PHP?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...