【问题标题】:PHP RegEx Remove Space After Every Comma In StringPHP RegEx 删除字符串中每个逗号后的空格
【发布时间】:2011-06-21 09:24:48
【问题描述】:

大家好。我有一串用逗号分隔的名称。我将这串名称分解成一个名称数组,其中逗号作为分隔符。我需要一个正则表达式来删除逗号之后的空格(如果有的话),而不是名字和姓氏之间的空格。

举个例子:

$nameStr = "Sponge Bob,Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";

看到 Ralph Kramden 之前的空格了吗?我需要删除那个空格,而不是名字之间的空格。而且我还需要在删除可能出现的名称之前添加任何其他空格。

P.S.:我注意到一个关于空白和这种情况的有趣行为。举个例子:

当没有像这样打破回声时:

$nameStr = "Sponge Bob,Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";

$nameArray = explode(",", $nameStr);

foreach($nameArray as $value)
{
    echo $value;

}

结果是:海绵鲍勃辛普森拉尔夫克拉姆登斯克罗吉叔叔米老鼠

请注意 Ralph Kramden 之前的空白区域

但是,当像这样打破上面的回声时:

echo $value . "<br />";

输出是:

海绵宝宝

巴特辛普森

拉尔夫·克拉姆登

斯克罗吉叔叔

米老鼠

所有的名字都与名字前似乎没有空格的地方对齐。

那么对于字符串开头的空格,PHP 的行为究竟是什么?

大家干杯。感谢您的回复。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    今天对使用正则表达式解决每一个小问题的执着是什么

    $nameStr = "Sponge Bob,Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";
    
    $nameArray = explode(",", $nameStr);
    
    foreach($nameArray as $value)
    {
        echo trim($value);
    
    }
    

    编辑

    PHP 对空格的行为是将其视为适当的字符并按照您的指示执行操作。 HTML 的行为(或者至少是网络浏览器的行为)是相当不同的......您需要学习和理解这种差异

    【讨论】:

    • 工作安全?毕竟,通过使用正则表达式来解决问题,你最终会遇到两个问题 - 即时额外的工作。
    • @Marc B - :·) 所以回答 SO 问题会对我们的工作保障产生不利影响
    • 嗯,我认为使用preg_split 比使用explodetrim 更合适...如果可以通过简单的正则表达式解决,为什么不这样做呢?
    • 啊,干杯马克,详尽的解释。我必须阅读这些功能以尝试记住它们的存在。谢谢。
    • 因为如果可以用简单的正则表达式来解决,大概也可以用内置函数来解决,像上面这样。
    【解决方案2】:

    试试

    $nameStr = preg_replace("/,([\s])+/",",",$nameStr);
    $nameArray = explode(",", $nameStr);
    

    这是一个可行的正则表达式解决方案,但正如其他人在上面指出的那样,一个简单的trim() 将完成您已有的工作。

    【讨论】:

      【解决方案3】:

      正如您提到的,仅在逗号之后删除空格,考虑到逗号之前的空格可以保留。

      你也可以在下面使用:

      $nameStr = "Sponge Bob,  Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";
      
      while (strpos($nameStr, ', ') !== FALSE) {
          $nameStr = str_replace(', ', ',', $nameStr);
      }
      echo $nameStr;
      

      在此之后,您可以简单地将其分解为:

      $allNames = explode(',', $nameStr);
      

      否则迈克尔的正则表达式非常好。

      【讨论】:

        【解决方案4】:

        你为什么不直接preg_split

        $names = preg_split('~,\s*~', $names);
        

        【讨论】:

          【解决方案5】:

          PHP 不在乎字符串中的内容,除非它解析它以进行变量插值。空格就像任何其他字符,一个 ascii 或 unicode 值,只是碰巧显示为“空白”。

          你如何替换那些逗号后的空格?

           $str = str_replace(', ', ',', $str);
                                ^--space
          

          如果这没有在您的 Ralph 名称之前捕获空格,那么很可能没有空格字符(ascii 32)。您可以尝试显示它的内容:

           echo ord(substr($nameArray['index of Ralph here'], 0, 1));
          

          【讨论】:

          • 发帖人并未声称他想要替换多个空格,但他应该知道您的解决方案仅适用于确切的一个空格,因此不会替换“..., Ralph” .
          【解决方案6】:

          你用修剪功能试过了吗?

          $nameStr = "Sponge Bob,Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";
          
          $nameArray = explode(",", $nameStr);
          
          for($i = 0; $i < count($nameArray); $i++) {
            $nameArray[$i] = trim($nameArray[$i];
          }
          $newNameStr = implode(',', $nameArray);
          

          您可以使用 RegExp 来执行此操作,但由于您似乎对 RegExp 不是很有经验,因此您不应该使用它们,因为如果操作不当,它们会损失大量性能。

          【讨论】:

            【解决方案7】:

            一个简单的解决方案是避免使用正则表达式并应用trim 函数:

            $nameStr = 'Bart Simpson, Lisa Simpson,Homer Simpson, Madonna';
            $names = explode(',', $nameStr);
            foreach($names as &$name) {
              $name = trim($name);
            }
            

            //当名字只有一个词时,这也不会动摇

            【讨论】:

              【解决方案8】:

              这个对我有用

              $string = "test1, test2, test3, test4, , ,";    
              array_map('trim', array_filter(explode(',', $string), 'trim'))
              

              输出

              => [
                   "test1",
                   "test2",
                   "test3",
                   "test4",
                 ]
              

              【讨论】:

              • 请分享更多细节 - 对我来说,这看起来像是已接受答案的替代版本,大约有 10 年历史了
              猜你喜欢
              • 1970-01-01
              • 2018-12-17
              • 2016-06-15
              • 2019-01-28
              • 2016-08-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多