PHP正则表达式:移除字符串中每个逗号后面的空格

4

大家好。我有一串用逗号分隔的名字字符串。我将这个名字字符串按照逗号分隔符拆分成一个名字数组。我需要一个正则表达式来仅移除逗号后面的空格(如果有的话),而不是第一个和最后一个名字之间的空格。

例如:

$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 在字符串开头有空格时的行为是什么?

祝大家好运。感谢回复。

8个回答

4
今天为什么如此痴迷于使用正则表达式来解决每一个小问题呢?
$nameStr = "Sponge Bob,Bart Simpson, Ralph Kramden,Uncle Scrooge,Mickey Mouse";

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

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

}

编辑

PHP对于空格的处理方式是将其视为适当的字符,并按照您的要求执行操作。HTML的行为(或至少是Web浏览器的行为)则不同...您需要学习并理解这种差异。


工作保障?毕竟,通过使用正则表达式来解决问题,你最终会面临两个问题——额外的即时工作。 - Marc B
@Marc B - :·) 所以回答SO的问题会不利于我们的工作安全。 - Mark Baker
我认为使用 preg_split 比使用 explodetrim 更合适... 如果可以通过简单的正则表达式解决,为什么不这样做呢? - NikiC
啊,谢谢马克,解释得非常详细。我得读一下那些函数,试着记住它们的存在。谢谢。 - Tableking
因为如果可以用简单的正则表达式解决,那么可能可以使用内置函数来解决,就像上面的例子一样。 - Andrew

4

尝试

$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);

否则,Michael的正则表达式非常好。

1

为什么不直接使用preg_split呢?

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

0

你尝试过使用 trim 函数吗?

$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并不是很熟悉,所以最好不要使用它们,因为如果使用不当会影响性能。


0
一个简单的解决方案是避免使用正则表达式,而是应用trim函数:
$nameStr = 'Bart Simpson, Lisa Simpson,Homer Simpson, Madonna';
$names = explode(',', $nameStr);
foreach($names as &$name) {
  $name = trim($name);
}

//当名称只有一个单词时,这也不会出现错误


0

这个对我有效

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

输出

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

请分享更多细节 - 对我来说,这似乎是已经有十年历史的被接受答案的另一种版本。 - Nico Haase

0

PHP对字符串的内容并不在意,除非它正在解析变量插值。空格就像任何其他字符一样,是一个ASCII或Unicode值,只是恰好显示为空格。

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

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

如果这个代码没有捕捉到你Ralph名字前的空格,那么很可能在那里的不是空格字符(ASCII 32)。您可以尝试使用以下命令来显示它是什么:
 echo ord(substr($nameArray['index of Ralph here'], 0, 1));

海报并没有声称他想替换超过一个空格,但他应该意识到你的解决方案仅适用于确切一个空格,因此“…,Ralph”不会被替换。 - Jens Kohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接