Php 正则表达式-preg_replace-一个返回空格,另一个不返回任何内容

Php 正则表达式-preg_replace-一个返回空格,另一个不返回任何内容,php,regex,utf-8,preg-replace,Php,Regex,Utf 8,Preg Replace,我正在清理一个UTF-8字符串:大写首字母-删除特殊字符-允许空格-允许逗号分隔和数字 我想知道,是否有可能创造出比下面更优雅的东西。 第一个preg_replace返回一个空格。其他将不替换任何内容 $cleanCats = array_map(function ($element) { $oneSpace = preg_replace('!\s+!', ' ', $element); $clean = preg_replace('~[^\pL\d ]+~u','',$one

我正在清理一个UTF-8字符串:大写首字母-删除特殊字符-允许空格-允许逗号分隔和数字

我想知道,是否有可能创造出比下面更优雅的东西。 第一个preg_replace返回一个空格。其他将不替换任何内容

$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)) . '*');
$arrFromHtml如下所示:

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â¬
)

您可以删除第一行
preg\u replace
并使用

$clean = preg_replace('~[^\p{L}\d\s]+|(\s)+~u','$1', $element);
它将查找所有出现的

  • [^\p{L}\d\s]+
    -1+字符,Unicode字母、数字或空格除外
  • |
    -或
  • (\s)+
    -1个或多个空格,最后一个空格捕获到组1中
替换的是
$1
,即组1中捕获的最后一个空格(因此,除最后一个空格外,所有空格都被删除)

要在字符串中也允许
,只需将其添加到求反字符类:

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

尝试删除第一行
preg_replace
并使用
$clean=preg_replace('~[^\p{L}\d\s]+|(\s)+~u','$1',$element)。在执行任何操作之前,必须解决编码问题。当您看到类似于
ÃAlpha
λ
的情况时,这意味着utf8字符串未正确显示(例如,当html中缺少编码时),或者字符串已被严重重新编码。一旦你用
æ
代替
Ã
ͻ
代替
λ
你就可以继续编辑了,否则你所要做的就是丢失信息。浏览器窗口不能正确显示数组。我可以使用always JSON控制JSON数据从HTML5传递到PHP/Ajax@WiktorStribiżew谢谢,这条缝很好用。我的网页上的这个字符串:
B:,.M·%&/W;λ希腊语;;;жжЖ俄语;Hel.loj;com,m()/a;Łódź;1个spc;3统计过程控制;丹麦人;欧元€
的结局是:
宝马、希腊语、俄罗斯语、希腊语、逗号、拉丁语、1 spc、3 spc、丹麦语、欧元
顺便说一句:如果我想允许一个点(.)-我应该如何更改正则表达式?@Thorkil:好的,好消息,在
标记之间添加
,并用正确的显示编辑你的问题。
$clean = preg_replace('~[^\p{L}\d\s.]+|(\s)+~u','$1', $element);