Регулярное выражение - preg_replace - один возвращает пробел, другой ничего не возвращает - PullRequest
1 голос
/ 01 апреля 2020

Я чищу строку UTF-8: первая буква в верхнем регистре - убрать специальные символы - Разрешить пробел - Разграничить запятыми и разрешить числа

Я задаюсь вопросом, можно ли создать что-то более элегантное, чем показано ниже. Первый preg_replace возвращает один пробел. other заменяется ничем.

$cleanCats = array_map(function ($element) { 
    $oneSpace = preg_replace('!\s+!', ' ', $element);
    $clean = preg_replace('~[^\pL\d ]+~u','',$oneSpace);
    return mb_strtoupper(mb_substr($clean, 0, 1)) . mb_substr($clean, 1);
}, $arrFromHtml);
echo json_encode('*' . strip_tags(implode(',', $cleanCats)) . '*');

$ arrFrom Html выглядит следующим образом:

Array
(
    [0] => B:.M¤%&/W
    [1] => λgreek
    [2] => бжÐrussian
    [3] => H<>elloj
    [4] => com,m()/a
    [5] => Åó*dź
    [6] => 1 spc
    [7] => 3   spc
    [8] => æøå danish
    [9] => Euroâ¬
)

, и это вывод:

*BMW,Λgreek,БжЖrussian,Helloj,Comma,Łódź,1 spc,3 spc,Æøå danish,Euro*

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете удалить первую preg_replace строку и использовать

$clean = preg_replace('~[^\p{L}\d\s]+|(\s)+~u','$1', $element);

. Она найдет все вхождения

  • [^\p{L}\d\s]+ - 1+ символов, кроме символов Юникода, цифры или пробелы
  • | - или
  • (\s)+ - 1 или несколько пробелов, последний из которых занесен в группу 1.

Замена: $1, то есть последний пробел, захваченный в Группу 1 (следовательно, удаляются все, кроме последнего пробела).

Чтобы также разрешить . в строке, просто добавьте его в класс отрицанных символов:

$clean = preg_replace('~[^\p{L}\d\s.]+|(\s)+~u','$1', $element);
...