Laravel 阿拉伯语蛞蝓
Laravel with Arabic Slugs
我正在使用 Laravel 6 构建博客应用程序
这个应用程序的语言是阿拉伯语
但是 slug 有问题,看起来 Laravel 不支持阿拉伯语。
有什么办法解决这个问题吗?
控制器
public function post($slug)
{
$post = Post::where('slug',$slug)->first();
return view('content.post',compact('post'));
}
存储方法
public function store(Request $request)
{
$this->validate($request, array(
'title' => 'required|max:255',
'slug' => 'required|min:3|max:255|unique:posts',
'body' => 'required',
));
$post = new Post;
$post->title = $request->input('title');
$post->slug = Str::slug($request->slug, '-');
$post->body = $request->input('body');
$post->save();
return redirect('admin/posts')->with('success', 'post is successfully saved');
}
路线
Route::get('post/{slug}', 'PagesController@post')->name('post.show');
Laravel对阿拉伯语等语言的音译支持不是很好。您也可以使用 PHP 的音译器 https://www.php.net/manual/en/transliterator.transliterate.php 在通过 Laravel 的 Str::slug
函数发送之前获取音译后的字符串。
例如,您可以这样使用:
Str::slug(transliterator_transliterate("Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", "arabic sentence you need slugged"));
请注意,您需要安装 PECL intl
才能运行。
你可以使用这个功能
public function slug($string, $separator = '-') {
if (is_null($string)) {
return "";
}
$string = trim($string);
$string = mb_strtolower($string, "UTF-8");;
$string = preg_replace("/[^a-z0-9_\sءاأإآؤئبتثجحخدذرزسشصضطظعغفقكلمنهويةى]#u/", "", $string);
$string = preg_replace("/[\s-]+/", " ", $string);
$string = preg_replace("/[\s_]/", $separator, $string);
return $string;
}
public function store(Request $request)
{
$this->validate($request, array(
'title' => 'required|max:255',
'slug' => 'required|min:3|max:255|unique:posts',
'body' => 'required',
));
$post = new Post;
$post->title = $request->input('title');
$post->slug = $this->slug($request->slug);
$post->body = $request->input('body');
$post->save();
return redirect('admin/posts')->with('success', 'post is successfully saved');
}
它将为每种语言阿拉伯语或英语制作 slug。
它将正常工作。
我知道@Mohammed Aktaa 已经给出了正确的答案,但它缺少删除前后斜杠的部分,这在请求 get url 时可能会导致致命错误,因为它有 slug:
所以通过以下方式更正 slug 函数:
public static function slug_ar($string, $separator = '-') {
if (is_null($string)) {
return "";
}
$string = trim($string);
$string = mb_strtolower($string, "UTF-8");
// '/' and/or '\' if found and not remoeved it will change the get request route
$string = str_replace('/', $separator, $string);
$string = str_replace('\', $separator, $string);
$string = preg_replace("/[^a-z0-9_\sءاأإآؤئبتثجحخدذرزسشصضطظعغفقكلمنهويةى]#u/", "",
$string);
$string = preg_replace("/[\s-]+/", " ", $string);
$string = preg_replace("/[\s_]/", $separator, $string);
return $string;
}
我正在使用 Laravel 6 构建博客应用程序 这个应用程序的语言是阿拉伯语 但是 slug 有问题,看起来 Laravel 不支持阿拉伯语。
有什么办法解决这个问题吗?
控制器
public function post($slug)
{
$post = Post::where('slug',$slug)->first();
return view('content.post',compact('post'));
}
存储方法
public function store(Request $request)
{
$this->validate($request, array(
'title' => 'required|max:255',
'slug' => 'required|min:3|max:255|unique:posts',
'body' => 'required',
));
$post = new Post;
$post->title = $request->input('title');
$post->slug = Str::slug($request->slug, '-');
$post->body = $request->input('body');
$post->save();
return redirect('admin/posts')->with('success', 'post is successfully saved');
}
路线
Route::get('post/{slug}', 'PagesController@post')->name('post.show');
Laravel对阿拉伯语等语言的音译支持不是很好。您也可以使用 PHP 的音译器 https://www.php.net/manual/en/transliterator.transliterate.php 在通过 Laravel 的 Str::slug
函数发送之前获取音译后的字符串。
例如,您可以这样使用:
Str::slug(transliterator_transliterate("Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", "arabic sentence you need slugged"));
请注意,您需要安装 PECL intl
才能运行。
你可以使用这个功能
public function slug($string, $separator = '-') {
if (is_null($string)) {
return "";
}
$string = trim($string);
$string = mb_strtolower($string, "UTF-8");;
$string = preg_replace("/[^a-z0-9_\sءاأإآؤئبتثجحخدذرزسشصضطظعغفقكلمنهويةى]#u/", "", $string);
$string = preg_replace("/[\s-]+/", " ", $string);
$string = preg_replace("/[\s_]/", $separator, $string);
return $string;
}
public function store(Request $request)
{
$this->validate($request, array(
'title' => 'required|max:255',
'slug' => 'required|min:3|max:255|unique:posts',
'body' => 'required',
));
$post = new Post;
$post->title = $request->input('title');
$post->slug = $this->slug($request->slug);
$post->body = $request->input('body');
$post->save();
return redirect('admin/posts')->with('success', 'post is successfully saved');
}
它将为每种语言阿拉伯语或英语制作 slug。 它将正常工作。
我知道@Mohammed Aktaa 已经给出了正确的答案,但它缺少删除前后斜杠的部分,这在请求 get url 时可能会导致致命错误,因为它有 slug:
所以通过以下方式更正 slug 函数:
public static function slug_ar($string, $separator = '-') {
if (is_null($string)) {
return "";
}
$string = trim($string);
$string = mb_strtolower($string, "UTF-8");
// '/' and/or '\' if found and not remoeved it will change the get request route
$string = str_replace('/', $separator, $string);
$string = str_replace('\', $separator, $string);
$string = preg_replace("/[^a-z0-9_\sءاأإآؤئبتثجحخدذرزسشصضطظعغفقكلمنهويةى]#u/", "",
$string);
$string = preg_replace("/[\s-]+/", " ", $string);
$string = preg_replace("/[\s_]/", $separator, $string);
return $string;
}