2009-12-15 50 views
4

我有一個我以前沒見過的問題。相同的正則表達式在兩臺不同的服務器上產生兩個不同的結果。PHP正則表達式 - 在2臺服務器上進行不同的解析

這是代碼:服務器

preg_replace('#[^\[email protected]]#iu', '', '!%&abc123_æøå'); 

結果A(PHP的5.2.6,服務器API:Apache 2.0的處理程序):

abc123_æøå

服務器B結果(php 5.2.5,Server Api:CGI/FastCGI):

123_

任何人有任何想法,爲什麼這種差異正在發生?

+0

看起來像一個雖然問題......奇怪的行爲! – 2009-12-15 10:16:04

回答

2

這一定是因爲

  • 區域設置
  • PHP字節字符串的開/關
  • PHP mb_string.func_overload支持(支持多字節的一些功能重載)
+0

感謝您的回覆:)我找不到任何這些東西在php.ini中,但我試着運行setlocale(LC_ALL,'no_NB');在正則表達式之前,沒有任何改變。如果我在'abc123_'上運行正則表達式,它仍會產生'123_',所以也許這不是一個多字節問題? – Tommy 2009-12-15 09:53:37

1

你可以嘗試使用mb_eregi_replace函數。

mb_eregi_replace('[^\[email protected]]', '', '!%&abc123_æøå'); 

應該在所有支持多字節字符串的服務器上一致地工作,並且應該消除由於不同的文件編碼而可能遇到的問題。 (理論上,至少)

+0

感謝您的回覆:)我試過了,它實際上產生的結果與我原始文章中的代碼相同。也許這是某種指標。 – Tommy 2009-12-15 09:51:30

+0

有趣。嘗試打印'mb_regex_encoding'。看看他們是不同的。你也可以在編碼中進行硬編碼。 'mb_regex_encoding('UTF-8');',或者你想要使用的任何編碼。 – Atli 2009-12-15 10:01:32

+0

感謝您的建議!我的編碼是ISO-8859-1,但即使使用utf-8,「mb_eregi_replace」和「preg_replace」也執行相同的操作。奇怪的東西。 – Tommy 2009-12-15 10:14:05

0

好吧,它終於被整理出來了。服務器從php 5.2.5升級到5.2.11(仍然以cgi運行),並且舊版本的問題消失了。

感謝大家的反饋和建議!