2

我需要substr在不破坏它的情况下使用多字节字符串,但是 PHP mb_ 扩展不可用。有替代品mb_substr吗?

4

3 回答 3

6

如果您的字符串是 unicode,您可以使用带有空模式的preg_split来解决问题。

一个简单的实现可能是:

function my_mb_substr($string, $offset, $length)
{
  $arr = preg_split("//u", $string);
  $slice = array_slice($arr, $offset + 1, $length);
  return implode("", $slice);
}

echo my_mb_substr("重庆大学", 1, 2); // 庆大
于 2012-11-26T11:13:43.373 回答
3

您可以使用Patchwork UTF-8,这是一个提供许多 Unicode 函数和函数后备的库mb_(如果它们不可用)。它是一种直接替代品,只需照常include使用即可。mb_substr不过它确实需要 PHP 5.3。

于 2012-11-26T11:12:08.157 回答
1

我有根据的猜测是你有 HTML 实体,所以你的文本实际上是这样的:

EDF, leader mondial de l'énergie nucléaire

...通过网络浏览器呈现,显示为:

EDF, leader mondial de l'énergie nucléaire

这与多字节问题无关。根本问题是 HTML 是一种富文本格式,不能像纯文本那样随意操作。

您需要获得可以处理的数据的纯文本表示形式。您可以使用strip_tags()去除 HTML 标签,但需要在截断之前完成。之后,您可以使用html_entity_decode()函数转换 HTML 实体:

$text = "EDF, leader mondial de l'énergie nucléaire";
$output = html_entity_decode($text, ENT_COMPAT | ENT_HTML401, 'UTF-8');

...假设您的网站使用 UTF-8。

注意:MB 扩展提供了类似的功能:

$text = "EDF, leader mondial de l'énergie nucléaire";
$output = mb_convert_encoding($text, 'UTF-8', 'HTML-ENTITIES');
于 2012-11-26T11:18:45.797 回答