регулярное выражение, чтобы получить текущую страницу или имя каталога? - PullRequest
2 голосов
/ 29 апреля 2010

Я пытаюсь получить страницу или последнее имя каталога из URL

например, если URL-адрес: http://www.example.com/dir/ я хочу, чтобы он возвращал dir, или если переданный URL-адрес http://www.example.com/page.php Я хочу, чтобы он возвращал page Обратите внимание, я не хочу использовать косую черту или расширение файла.

Я пробовал это:

$regex = "/.*\.(com|gov|org|net|mil|edu)/([a-z_\-]+).*/i";

$name = strtolower(preg_replace($regex,"$2",$url));

Я запустил это регулярное выражение в PHP, и оно ничего не вернуло. (однако я протестировал то же регулярное выражение в ActionScript, и оно сработало!)

Так что же я здесь делаю не так, как я могу получить то, что хочу?

Спасибо !!!

Ответы [ 8 ]

6 голосов
/ 29 апреля 2010

Не используйте / в качестве разделителя регулярных выражений, если он также содержит косые черты. Попробуйте это:

$regex = "#^.*\.(com|gov|org|net|mil|edu)/([a-z_\-]+).*$#i";
3 голосов
/ 29 апреля 2010

Вы можете попробовать убежать от "/" в середине. Это просто закрывает ваше регулярное выражение. Так что это может работать:

$regex = "/.*\.(com|gov|org|net|mil|edu)\/([a-z_\-]+).*/i";

Вы также можете сделать регулярное выражение несколько более общим, но это еще одна проблема.

0 голосов
/ 29 апреля 2010

Сохраните регулярное выражение и сделайте другие функции PHP более любимыми.

$url  = "http://www.example.com/page.php";
$filename = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_FILENAME);

Предупреждение: для PHP 5.2 и выше.

0 голосов
/ 29 апреля 2010

Это выражение:

(?<=^[^:]+://[^.]+(?:\.[^.]+)*/)[^/]*(?=\.[^.]+$|/$)

Дает следующие результаты:

http://www.example.com/dir/            dir
http://www.example.com/foo/dir/        dir
http://www.example.com/page.php        page
http://www.example.com/foo/page.php    page

Заранее извиняюсь, если это недопустимое регулярное выражение PHP - я протестировал его, используя RegexBuddy .

0 голосов
/ 29 апреля 2010

Как бы мне лично ни нравилось использовать регулярные выражения, более «грубые» (из-за отсутствия лучшего слова) строковые функции могут быть хорошей альтернативой для вас. В приведенном ниже фрагменте кода используется sscanf для синтаксического анализа части пути URL первой группы букв.

$url  = "http://www.example.com/page.php";
$path = parse_url($url, PHP_URL_PATH);
sscanf($path, '/%[a-z]', $part);
// $part = "page";
0 голосов
/ 29 апреля 2010

Предполагая, что вы хотите сопоставить весь адрес после доменной части:

$regex = "%://[^/]+/([^?#]+)%i";

Выше предполагается, что URL-адрес формата расширение : //domainpart/everythingelse.

0 голосов
/ 29 апреля 2010

Опять же, похоже, что проблема здесь не в том, что ваш RegEx недостаточно мощный, просто неправильно набран (закрывающий разделитель в середине строки). Я оставлю это для потомков, но я настоятельно рекомендую вам проверить PHP parse_url() метод.

Это должно адекватно доставить:

substr($s = basename($_SERVER['REQUEST_URI']), 0, strrpos($s,'.') ?: strlen($s))

Но это лучше:

preg_replace('/[#\.\?].*/','',basename($path));

Хотя, ваш пример короткий, поэтому я не могу сказать, хотите ли вы сохранить весь путь или только его последний элемент. Предыдущий пример сохранит только последний фрагмент, но он должен сохранить весь путь, будучи достаточно универсальным, чтобы работать практически со всем, что может быть вам брошено:

preg_replace('~(?:/$|[#\.\?].*)~','',substr(parse_url($path, PHP_URL_PATH),1));
0 голосов
/ 29 апреля 2010

Вы можете использовать это

array_pop(explode('/', $url));

Затем примените простое регулярное выражение для удаления любого расширения файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...