Сопоставление любых пробельных символов Юникода в строке с регулярным выражением PHP - PullRequest
0 голосов
/ 18 мая 2018

Я хочу разбить текстовое сообщение на массив в каждом пробеле.Он работал нормально, пока я не получил это текстовое сообщениеВот несколько строк кода, которые обрабатывают текстовую строку:

    $str = 'T bw4  05/09/19 07:51 am BW6N 499.803';
    $cleanStr = iconv("UTF-8", "ISO-8859-1", $str);
    $strArr = preg_split('/[\s\t]/', $cleanStr);
    var_dump($strArr);

Var_dump дает этот результат:

array:6 [▼
 0 => "T"
 1 => b"bw4  05/09/19"
 2 => "07:51"
 3 => "am"
 4 => "BW6N"
 5 => "499.803"
]

Элемент # 1 в массиве "1 => b" bw4 05/ 09/19 "" неверно, я не могу понять, что такое буква "b" перед значением массива.Кроме того, пробел (ы) между "bw4" и "05/09/19" Любые предложения о том, как лучше добиться расщепления струн, очень приветствуются.Вот оригинальная строка: https://3v4l.org/2L35M, а вот изображение результата с моего локального хоста: http://prntscr.com/jjbvny

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Я полагаю, ваш вход не закодирован должным образом.Попробуйте:

$cleanStr = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', utf8_encode($str));

Это очищает строку для меня: https://3v4l.org/d80QS (если она отображается правильно на этот раз).

Примечание: Это также может означать кодировкуПо пути повреждена из вашей базы данных (текст хранится в UTF-8?), с вашего веб-сервера (в файле httpd.conf Apache AddDefaultCharset UTF-8 set?) или из PHP (что такое default_charset в вашем PHP.INI-файл? ="utf-8"?), Веб-сайт (<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />) или спецификация (метка порядка байтов) в начале исходного файла?

0 голосов
/ 18 мая 2018

Чтобы соответствовать любому 1 или более символам пробела Unicode, вы можете использовать

'~\s+~u'

Ваш шаблон '/[\s\t]/' соответствует только одному символу пробела (\s) или вкладке (\t) (котораяконечно, избыточно, так как \s уже совпадает и с вкладками), но поскольку модификатор u отсутствует, \s не может соответствовать символам \ u00A0 (пробелам), которые у вас есть после bw4.

Итак, используйте

$str = 'T bw4  05/09/19 07:51 am BW6N 499.803';
$strArr = preg_split('/\s+/u', $str);
print_r($strArr);

См. PHP демо , получив

Array
(
    [0] => T
    [1] => bw4
    [2] => 05/09/19
    [3] => 07:51
    [4] => am
    [5] => BW6N
    [6] => 499.803
)
0 голосов
/ 18 мая 2018

Поскольку вы упоминаете, что значения не разделяются должным образом. Сначала попробуйте обрезать строку с обоих концов

Далее замените несколько пробелов в строке одним пробелом

$output = preg_replace('!\s+!', ' ', trim($str," "));

После этого вы можете взорваться на основе пробела

$fout = explode(" ",$output);

Затем вы можете распечатать его.

Что касается префикса b, ссылка, которую разместил @Daniel A. White, имеет видсоответствующий ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...