2016-02-02 5 views
1

У нас есть проблема, когда функции дают разные результаты в зависимости от того, на каком сервере он работает.php preg_match_all другой результат в IIS только с конкретным японским символом

Функция заключается в следующем:

<?php 
$s='校'; 
preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches); 

Результаты различной в зависимости от окружающей среды:

WAMP (PHP 5.5.12 PCRE 8,34) и

ЛАМПА (php 5.3.3 PCRE 7.8) среды дают одинаковый результат

array (size=3) 
    0 => 
    array (size=1) 
     0 => string '校' (length=3) 
    1 => 
    array (size=1) 
     0 => string '' (length=0) 
    2 => 
    array (size=1) 
     0 => string '' (length=0) 

WS2008 IIS7 (PHP 5.4.24 PCRE 8,32)

array(3) { 
    [0]=> array(2) { 
     [0]=> string(1) "�" 
     [1]=> string(1) "�" 
    } 
    [1]=> array(2) { 
     [0]=> string(0) "" 
     [1]=> string(0) "" 
    } 
    [2]=> array(2) { 
     [0]=> string(0) "" 
     [1]=> string(0) "" 
    } 
} 

Теперь, действительно странно, что с большим количеством различных японских символов, результаты будут правильными на всех средах. Прямо сейчас единственный раз, когда мы могли воспроизвести эту проблему, был этот символ «校». Если это сопровождается (например, $ s = '校正') или только, результат всегда будет отличаться от IIS с тем, что выглядит как проблема с кодировкой « ».

Я первый попытался заглянуть в версию PHP и PCRE версию, но оба старые версии на нашей ЛАМПЕ, так что я думал, что проблема может быть где-то еще ...

С уважением

+2

При работе с строками Unicode вам необходимо передать модификатор '/ u'. Попробуйте ''/". *? (" | $) | ((? <= [\ S ", +]) | ^) [^ \ s", +] +/u''. –

+0

Действительно, это было очень просто, но я не думал об этом, так как другие персонажи работали правильно. Пожалуйста, напишите ответ, и я подтвержу его вам. – TheTrueTDF

ответ

1

При работе со строками Unicode вам необходимо передать модификатор /u с рисунком.

Использование

'/".*?("|$)|((?<=[\s",+])|^)[^\s",+]+/u'. 

Кроме того, следует отметить, что внутри одного цитируемый буквальным, вам не нужно использовать два раза подряд с \\s, используйте один обратный слэш.