Мне нужно создать маршрут, который отвечает на любую строку, начинающуюся с символа «@». Маршруты похожи на следующие примеры:
www.mywebsite.com/@john
www.mywebsite.com/@jack
www.mywebsite.com/@something
Итак, я написал:
Route::get('{something}','SomeController@someMethod')->where('something','/@^/');
Но когда я его тестирую, я сталкиваюсь с 404 не найденной страницей.
какое правильное регулярное выражение для этого?
@ WiktorStribiżew не работает
Попробуйте удалить разделители /. ->where('something','^@')
Удаление / исправление.
Отлично. Обратите внимание, что шаблон @^ означает, что после @ должно следовать начало строки, и это невозможно, шаблон просто никогда не совпадает. '^@' утверждает позицию в начале строки и только там пытается сопоставить @.





Route::get('/{tag}', 'SomeController@someMethod')->where('tag', '^@.*');
Вы можете написать это
Route::pattern('tag', '@[a-zA-Z]');
Route::get('{tag}', 'SomeController@someMethod');
Таким образом, вы разделяете логику регулярного выражения и маршрут, и он будет работать так, как вы хотите.
Обратите внимание, что шаблон @^ означает, что после @ должно следовать начало строки, что невозможно, и шаблон никогда не соответствует какой-либо строке. Шаблон '^@' утверждает позицию в начале строки, и только там он пытается сопоставить @.
Кроме того, обычные разделители регулярных выражений / должны быть удалены из этого шаблона, поскольку они рассматриваются здесь как часть шаблона.
Итак, в вашем случае вы можете просто поменять местами привязку и символ @:
Route::get('{something}','SomeController@someMethod')->where('something','^@');
Это также будет работать:
Route::get('@{something}', 'SomeController@someMethod');
Попробуйте
->where('something','/^@.*/'). Или, может быть, достаточно просто заменить начало строки привязки^на@.