preg_replace 阿拉伯文标题,如 Hello-welcome-here

preg_replace arabic title like مرحبا-اهلاً-بك-هنا

伙计们,我已经尝试了很多功能,但没有一个能以应有的方式帮助我。

我有 htaccess 可以将 URL 替换为友好的 URL 就像 (test-test-test-test)

在英语中一切正常,但在阿拉伯语中不工作(مرحبا-مرحبا-مرحبا-مرحبا) 不工作 可能

// English function work fine! replace long title with dashes 
// ex: hello-world-how-is-everything
    function seoUrl($string) {
        $string = strtolower($string);
        $string = str_replace('&',' ',$string);
        $string = preg_replace("/[^a-z0-9_\s-]/", "", $string);
        $string = preg_replace("/[\s-]+/", " ", $string);
        $string = preg_replace("/[\s_]/", "-", $string);
        return $string;
    }

所以我希望它能用阿拉伯语工作.. 谢谢

<?php
function seoUrl($string) {
    $string = strtolower($string);
    $string = str_replace('&',' ',$string);
    $string = preg_replace("/[chr(0600)-chr(0600FF)a-z0-9_\s-]/is", "", $string);
    $string = preg_replace("/[\s-]+/", " ", $string);
    $string = preg_replace("/[\s_]/", "-", $string);
    return $string;
}
var_dump(seoUrl("مرحبا-مرحبا-مرحبا-مرحبا"));

不知道这是不是你想要的

您需要在几个地方修复您的代码,主要是通过匹配任何 Unicode letters/digits 并将多个连续连字符或白色 space 替换为单个连字符。另外,你的替换也需要调整:

function seoUrl($string) {
        $string = mb_strtolower($string);
        $string = str_replace('&',' ',$string);
        $string = preg_replace("/[^\w\s-]+/u", " ", $string);
        $string = preg_replace("/[\s-]+/u", " ", $string);
        $string = preg_replace("/[\s_]+/u", "-", $string);
        return $string;
    }

echo seoUrl("Test--++_-__-Test----Test$#%#Test") . PHP_EOL;
echo seoUrl("مرحبا--++_-__مرحباt--مرحباst$#%#مرحبا") . PHP_EOL;
// => test-test-test-test
// => مرحبا-مرحباt-مرحباst-مرحبا

参见PHP demo

备注:

  • mb_strtolower($string); - 处理Unicode字符串,首选mb_strtolower
  • preg_replace("/[^\w\s-]+/u", " ", $string) - 使用 /u 标志,\w\s 匹配任何 Unicode 单词和白色 space 字符,因此您不再删除阿拉伯语和其他 letters/digits;请注意,您需要用 space 替换匹配项,而不是此处的空字符串
  • preg_replace("/[\s-]+/u", " ", $string)preg_replace("/[\s_]+/u", "-", $string) - 添加了 u 标志,+ 确保替换整个连续的匹配块,而不是一个接一个地替换字符。