Я новичок в регулярных выражениях и задаюсь вопросом, как фраза одна, которая собирает все после последнего /
.
Я извлекаю идентификатор, используемый Google GData.
моя строка примера
http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123
Где идентификатор: p1f3JYcCu_cb0i0JYuCu123
О, и я использую PHP.
Это соответствует хотя бы одному из (ничего не косой черты), за которым следует конец строки:
[^/]+$
Заметки:
+
(вместо *
), так что если последний символ является косой чертой, он не соответствует (а не соответствует пустой строке). Но, скорее всего, более быстрое и простое решение заключается в использовании встроенных функций обработки списка строк вашего языка, то есть ListLast( Text , '/' )
или эквивалентной функции.
Для PHP ближайшей функцией является strrchr, которая работает следующим образом:
strrchr( Text , '/' )
Это включает в себя косую черту в результатах – согласно комментарию Тедди ниже, вы можете удалить косую черту с помощью substr :
substr( strrchr( Text, '/' ), 1 );
В общем:
/([^/]*)$
Тогда нужные вам данные будут соответствовать первой группе.
Изменить Поскольку вы используете PHP, вы также можете использовать strrchr
который возвращает все, начиная с последнего появления символа в строке до конца. Или вы можете использовать комбинацию strrpos
и substr
, сначала найдите позицию последнего появления, а затем получите подстроку с этой позиции до конца. Или explode
и array_pop
, разбить строку на /
и получить только последнюю часть.
Вы также можете получить «имя файла» или последнюю часть с помощью функции basename .
<?php $url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123'; echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"
На моей коробке я мог просто передать полный URL. Возможно, вам понадобится снять http:/
с фронта.
Basename и dirname отлично подходят для перемещения по всему, что выглядит как путь к файлу unix.
/^.*\/(.*)$/
^
= начало строки
.*\/
= жадный совпадение до последнего события до / от начала строки
(.*)
= группа всего, что приходит после последнего события /
вы также можете нормализовать разделение строк
$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123"; $s = explode("/",$str); print end($s);
Этот шаблон не будет записывать последнюю косую черту в $0
, и она не будет соответствовать ничем, если после последней косой черты нет символов.
/(?<=\/)([^\/]+)$/
Редактировать: но для этого требуется lookbehind, не поддерживаемый ECMAScript (Javascript, Actionscript), Ruby или несколькими другими вариантами . Если вы используете один из этих ароматов, вы можете использовать:
/\/([^\/]+)$/
Но он зафиксирует последний слэш в $0
.
Не программист PHP, но strrpos кажется более перспективным местом для начала. Найдите самый правый '/', и все, что прошло, это то, что вы ищете. Нет регулярного выражения.
Найти позицию последнего вхождения символа в строке
основанный на ответе @ Mark Rushakoff, лучшее решение для разных случаев:
<?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 ?>