PHP - preg_replace 和 UTF8
PHP - preg_replace and UTF8
我目前正在从我的数据库中检索数据。我收到一个数组,其中包含带有 UTF8 编码值的 'title' 索引。我想要的是使用此值作为保存内容的文件的名称,所以我这样做:
file_put_contents($filename, $content);
$文件名在哪里
'-' . $category['root'] . '-articles-' . $category['id'] . '-' . $this->Urlize($category['category'])
这里是"Urlize"的代码:
private function Urlize($value)
{
if ($value != null && trim($value) != '')
{
$value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
$value = preg_replace('/[\s]/i', '-', $value);
$value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
$value = preg_replace('/[-]+/i', '-', $value);
$value = preg_replace('/(^-)/i', '', $value);
$value = preg_replace('/-$/i', '', $value);
$value = preg_replace('/[éèê]/i', 'e', $value);
$value = preg_replace('/[âà]/i', 'a', $value);
$value = preg_replace('/[öô]/i', 'o', $value);
$value = preg_replace('/[ûùü]/i', 'u', $value);
$value = preg_replace('/[îïíì]/i', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
$value = preg_replace('/[<>]/i', '-', $value);
if ($value[strlen($value) - 1] == '-')
{
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
我的问题是,对于标题 "Théorie générale",我得到 "theeorie-geeneerale",所以 "e" 加倍了。我想这与字符集有关,因为我找不到避免它的好方法。当然,我想要 "theorie-generale".
谢谢
在正则表达式中使用 unicode 时,您需要使用 unicode 修饰符 u
。
所以尝试:
function Urlize($value) {
if ($value != null && trim($value) != '')
{
$value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
$value = preg_replace('/[\s]/i', '-', $value);
$value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
$value = preg_replace('/[-]+/i', '-', $value);
$value = preg_replace('/(^-)/i', '', $value);
$value = preg_replace('/-$/i', '', $value);
$value = preg_replace('/[éèê]/iu', 'e', $value);
$value = preg_replace('/[âà]/iu', 'a', $value);
$value = preg_replace('/[öô]/iu', 'o', $value);
$value = preg_replace('/[ûùü]/ui', 'u', $value);
$value = preg_replace('/[îïíì]/ui', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
$value = preg_replace('/[<>]/i', '-', $value);
if ($value[strlen($value) - 1] == '-')
{
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
echo Urlize('Théorie générale');
演示:http://sandbox.onlinephpfunctions.com/code/3b7e5985dc23ac71a6298783d2dad646d875d3c8
输出:
theorie-generale
您可以使用 |
(或)分组来减少您拥有的 preg_replace 的数量。不过,这可能会使您的正则表达式更难阅读。您还可以使用数组进行查找和替换。这是第一种方法。
function Urlize($value) {
if ($value != null && trim($value) != '')
{
$value = preg_replace('/(([\[\(].*[\]\)])|(^-)|-$)/i', '', $value);
$value = preg_replace('/([,!?.;:\"\'&+\/]|[\s]|[-]+|[<>])/i', '-', $value);
$value = preg_replace('/[éèê]/iu', 'e', $value);
$value = preg_replace('/[âà]/iu', 'a', $value);
$value = preg_replace('/[öô]/iu', 'o', $value);
$value = preg_replace('/[ûùü]/ui', 'u', $value);
$value = preg_replace('/[îïíì]/ui', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
if ($value[strlen($value) - 1] == '-') {
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
echo Urlize('Théorie générale');
我目前正在从我的数据库中检索数据。我收到一个数组,其中包含带有 UTF8 编码值的 'title' 索引。我想要的是使用此值作为保存内容的文件的名称,所以我这样做:
file_put_contents($filename, $content);
$文件名在哪里
'-' . $category['root'] . '-articles-' . $category['id'] . '-' . $this->Urlize($category['category'])
这里是"Urlize"的代码:
private function Urlize($value)
{
if ($value != null && trim($value) != '')
{
$value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
$value = preg_replace('/[\s]/i', '-', $value);
$value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
$value = preg_replace('/[-]+/i', '-', $value);
$value = preg_replace('/(^-)/i', '', $value);
$value = preg_replace('/-$/i', '', $value);
$value = preg_replace('/[éèê]/i', 'e', $value);
$value = preg_replace('/[âà]/i', 'a', $value);
$value = preg_replace('/[öô]/i', 'o', $value);
$value = preg_replace('/[ûùü]/i', 'u', $value);
$value = preg_replace('/[îïíì]/i', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
$value = preg_replace('/[<>]/i', '-', $value);
if ($value[strlen($value) - 1] == '-')
{
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
我的问题是,对于标题 "Théorie générale",我得到 "theeorie-geeneerale",所以 "e" 加倍了。我想这与字符集有关,因为我找不到避免它的好方法。当然,我想要 "theorie-generale".
谢谢
在正则表达式中使用 unicode 时,您需要使用 unicode 修饰符 u
。
所以尝试:
function Urlize($value) {
if ($value != null && trim($value) != '')
{
$value = preg_replace('/([\[\(].*[\]\)])/i', '', $value);
$value = preg_replace('/[\s]/i', '-', $value);
$value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value);
$value = preg_replace('/[-]+/i', '-', $value);
$value = preg_replace('/(^-)/i', '', $value);
$value = preg_replace('/-$/i', '', $value);
$value = preg_replace('/[éèê]/iu', 'e', $value);
$value = preg_replace('/[âà]/iu', 'a', $value);
$value = preg_replace('/[öô]/iu', 'o', $value);
$value = preg_replace('/[ûùü]/ui', 'u', $value);
$value = preg_replace('/[îïíì]/ui', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
$value = preg_replace('/[<>]/i', '-', $value);
if ($value[strlen($value) - 1] == '-')
{
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
echo Urlize('Théorie générale');
演示:http://sandbox.onlinephpfunctions.com/code/3b7e5985dc23ac71a6298783d2dad646d875d3c8
输出:
theorie-generale
您可以使用 |
(或)分组来减少您拥有的 preg_replace 的数量。不过,这可能会使您的正则表达式更难阅读。您还可以使用数组进行查找和替换。这是第一种方法。
function Urlize($value) {
if ($value != null && trim($value) != '')
{
$value = preg_replace('/(([\[\(].*[\]\)])|(^-)|-$)/i', '', $value);
$value = preg_replace('/([,!?.;:\"\'&+\/]|[\s]|[-]+|[<>])/i', '-', $value);
$value = preg_replace('/[éèê]/iu', 'e', $value);
$value = preg_replace('/[âà]/iu', 'a', $value);
$value = preg_replace('/[öô]/iu', 'o', $value);
$value = preg_replace('/[ûùü]/ui', 'u', $value);
$value = preg_replace('/[îïíì]/ui', 'i', $value);
$value = preg_replace('/[#]/i', 'sharp', $value);
if ($value[strlen($value) - 1] == '-') {
$value = substr($value, 0, strlen($value) - 1);
}
}
return strtolower($value);
}
echo Urlize('Théorie générale');