直接替换mb_substr?

时间:2012-11-26 10:45:28

标签: php

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

3 个答案:

答案 0 :(得分: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); // 庆大

答案 1 :(得分:3)

您可以使用Patchwork UTF-8,这是一个为mb_函数提供许多Unicode函数和回退的库,如果它们不可用。这是替代品,只需include,并像往常一样使用mb_substr。它确实需要PHP 5.3。

答案 2 :(得分: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');