PHP RegEx在字符串中的每个逗号后删除空格

时间:2011-02-04 14:02:04

标签: php regex

嘿所有人。我有一串用逗号分隔的名字。我将这一串名称扩展为一个以逗号作为分隔符的名称数组。我需要一个RegEx来删除逗号之后的空格(如果有的话)而不是第一个和最后一个名字之间的空格。

以此为例:

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

}

结果是:海绵BobBart Simpson Ralph Kramden Uncle ScroogeMickey Mouse

请注意在Ralph Kramden

之前仍有空白区域

然而,当线路破坏上面的回声时如此:

echo $value . "<br />";

输出结果为:

Sponge Bob

巴特辛普森

拉尔夫克拉姆登

Uncle Scrooge

米老鼠

并且所有名称都与名称前面没有空格的内容对齐。

那么PHP在字符串开头的白色空间的确切行为是什么?

干杯。谢谢你的回复。

8 个答案:

答案 0 :(得分:3)

今天使用正则表达式解决每一个小问题的注意事项

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

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

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

}

修改

PHP的行为空白区域是将其视为适当的角色并按照您的说法执行操作。 HTML的行为(或者至少是Web浏览器的行为)是相当不同的......你需要学习和理解这种差异

答案 1 :(得分: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);

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

答案 2 :(得分:2)

尝试

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

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

答案 3 :(得分:0)

PHP不会关心字符串中的内容,除非它正在解析变量插值。空格就像任何其他字符一样,ascii或unicode值恰好显示为“空白”。

您如何替换这些后逗号空间?

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

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

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

答案 4 :(得分:0)

你是否尝试过修剪功能?

$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不太熟悉,因此不应使用它们,因为在执行错误时它们会花费大量性能。

答案 5 :(得分:0)

为什么不只是preg_split

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

答案 6 :(得分:0)

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

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

//当名称只有一个单词

时,这也不会动摇

答案 7 :(得分:0)

这个对我有用

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

输出

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