在 CakePHP slugs 中删除特殊字符并将带重音符号的元音转换为不带重音符号的元音

Remove special characters and convert vowels with accent marks to vowels without accent marks in CakePHP slugs

我的鼻涕虫需要两个改进:

  1. Removing special characters.

  2. Converting vowels with accent marks to vowels without accent marks.

问题是我的网站正在生成 URLs,其中包含 slug,例如:

https://example.net/Toronto/product/férula-dental-limpieza-con-ul

https://cuponclub.net/Toronto/product/lifting-de-pestañas

URL 中的那些特殊字符,如“é”和“ñ”,由于许多不同的原因,例如当我将 URLs 集成到我使用的 API 时,对我来说往往是个问题甚至在共享链接时...

我正在使用 CakePHP 1.2。这就是我在代码中实现 slugs 的方式:

class Product extends AppModel{
    ..........
    ..........
    ..........
    var $actsAs = array(
        'Sluggable' => array(
            'label' => array(
                'short_name'
            ),
            'length' => 30,
            'overwrite' => false
        )
    );
    ..........
    ..........
    ..........
}

在数据库中,'short_name' 是用于生成 slug 的字段。如果没有 CakePHP,PHP 已经提供了内置函数,例如 str_replace()preg_replace(),通过使用这些函数和正则表达式,例如 [^A-Za-z0-9\-],我可以在用连字符替换所有空格后删除所有特殊字符。但是由于我使用的是CakePHP,所以我需要使用它的语法。我在阅读 https://github.com/msadouni/cakephp-sluggable-plugin 时发现了有关 label:

的信息

label : (array | string, optional) set to the field name that contains the string from where to generate the slug, or a set of field names to concatenate for generating the slug. DEFAULTS TO: title

我可以将 label 视为字符串并对其应用 str_replace()preg_replace() 等函数吗?

鉴于您正在使用的插件在过去 10 年内没有任何更新,我可以肯定地说,如果您不想 create a behavior from scratch 也就是说,这也不难做到

因此,只需分叉它并进行所需的更改或创建自定义行为。我还建议看看最新的 CakePHP 是如何处理这个问题的,请参阅 INTL 扩展提供的 \Cake\Utility\Text::slug(). If your PHP installation supports it, then you may want to backport this, ie make use of PHPs transliteration functionality 的源代码。