preg_replace - 未在服务器

时间:2015-11-18 06:34:47

标签: php regex drupal-7 preg-replace diacritics

我写了一个小函数来用字符串替换变音符号和其他特殊的德语字符。

整个事情看起来像那样:

function replace_german_chars($str)
{
  return preg_replace(
    array("/\s+/", "@\x{00e4}@u", "@\x{00fc}@u", "@\x{00f6}@u", "@\x{00df}@u"),  
    array("-", "ae", "ue", "oe", "ss"), 
    $str);
}

该代码主要受php手册中this评论的影响。

但是,它可以在我的localhost(Mac OSX Yosmite)上运行,但不能在服务器上运行。上面的函数只是替换了特殊的字符。

任何想法?

[UPDATE]

获得足够的许可后,我可以设法插入建议的»ini_sets«。其中一些似乎在整个应用程序生命周期中都存活了“有些”,而有些则没有。在此设置之前使用mb_convert_encoding有效,但之后没有,并且会为所有匹配返回?

我真的不明白这一点。我有点奇怪,因为看起来实际上有多种编码,即使Drupal说它在内部处理utf-8中的所有内容。

[更新#2]

旅程继续,设置mbstring.http_output=UTF-8让Drupal说:“禁用它”!现在,我没有真正意见可能来自哪里,所以我决定发布页面的http标题:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 25 Nov 2015 10:07:23 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Language: de
Link: </node/10>; rel="shortlink",</startseite>; rel="canonical"
X-Generator: Drupal 7 (http://drupal.org)
X-Powered-By: PleskLin

除此之外,还有另一个可能导致问题的原因:phpMyAdmin内数据库服务器的整体排序规则设置。为了清楚起见,这是一张图片:

enter image description here

数据库服务器本身配置为使用UTF-8

2 个答案:

答案 0 :(得分:1)

preg_replace()期待utf-8编码的字符串。您似乎已设置了不同的默认编码。然后,您需要转换$str

  

string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ] )

     

将字符串str的字符编码从to_encoding转换为from_encoding

此函数默认将内部字符编码为from_encoding。如果默认情况下未检测到,请从supported encodings

之一设置编码

<强>代码

function replace_german_chars($str)
{
  return preg_replace(
    array("/\s+/", "@\x{00e4}@u", "@\x{00fc}@u", "@\x{00f6}@u", "@\x{00df}@u"),  
    array("-", "ae", "ue", "oe", "ss"), 
    mb_convert_encoding($str, 'UTF-8') );
}

rextester demo

答案 1 :(得分:0)

您问题的最可能解决方案是unicode内容。

您应该在Apache配置中使用以下语法(在httpd.conf或.htaccess中)

AddDefaultCharset utf-8

在配置

下面的php.ini中
default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.func_overload=6
mbstring.http_output=UTF-8
mbstring.encoding_translation=On