Regex match url без расширения файла

Я хотел бы получить некоторую помощь, соответствующую следующим URL-адресам.

/settings => /settings.php
/657_46hallo => /657_46hallo.php
/users/create => /users.php/create
/contact/create/user => /contact.php/create/user
/view/info.php => /view.php/info.php
/view/readme - now.txt => /view.php/readme - now.txt
/ => [NO MATCH]
/filename.php => /unknown.php
/filename.php/users/create => /unknown.php

Если первая часть после имени домена-это имя файла, заканчивающееся на ".РНР" (см. последние 2 примера) он должен перенаправляться в /unknown.в PHP

Я думаю, мне нужно 2 регулярных выражения 1-й должен быть почти что-то вроде: ^/([a-zA-Z0-9_]+)(/)?(.*)?$ 2nd, чтобы поймать прямое имя файла " / filename.php " или " / filename.php / создать / пользователь" так я могу перенаправить в неизвестное.в PHP

1-е регулярное выражение что у меня почти получилось с первой частью. ==============================================

request url: http://domain.com/user/create
regex: ^/([a-zA-Z0-9_]+)(/)?(.*)?$
replace http://domain.com/.php
makes: http://domain.com/user.php/create

проблема это также соответствует http://domain.com/user.php/create

Если кто-то может помочь мне с регулярными выражениями, что было бы здорово.

2 ответов


если вы хотите соответствовать этим .php случаях вы можете попробовать это:

^\/([a-zA-Z0-9_]+)(\/)?(.*)?$

посмотреть здесь Regexr

если вы хотите избежать этих случаев, попробуйте следующее:

^/([a-zA-Z0-9_]+)(?!\.php)(?:(/)(.*)|)$

посмотреть здесь Regexr

на (?!\.php) это негативный взгляд вперед, который гарантирует, что нет .php на этом месте.


когда все у вас есть-это молоток...

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

разделите строку, используя ' / 'в качестве разделителя, посмотрите, заканчивается ли первый компонент на'.php'; если это так, отклоните его, иначе добавьте '.php ' к первому компоненту и присоединить компоненты обратно с помощью '/'.