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 ' к первому компоненту и присоединить компоненты обратно с помощью '/'.