【问题标题】:how to remove comma white space during explode and replace?如何在分解和替换期间删除逗号空格?
【发布时间】:2011-06-26 15:26:39
【问题描述】:
$data = "google,facebook,youtube,twitter,bing";

$exp = explode(",",$data);

$rep = str_replace("facebook",$exp);
$final = implode(",",$rep);

echo $final

output// google,,youtube,twitter,bing

如何删除这个带逗号的空格?

【问题讨论】:

  • 您真正想要实现的目标是什么。你为什么不只是 str_replace("facebook,") ?这个问题有更广泛的原因吗?
  • implode 将为数组中的每个元素保留一个“空格”生成的字符串,无论它有内容还是空白。要从您生成的 CSV 字符串中删除某些内容,您必须 unset() 数组元素本身(例如,将其从数组中完全删除),而不仅仅是将其设置为空白值。
  • 如果其中任何一个对您有帮助,请不要忘记选择一个答案:)
  • @limo 您已经有 5 年没去过 SO 了,所以也许您不会回来,但如果您这样做了,请阅读我的回答,我想您会在页面上找到最好的答案。请考虑将接受的答案转换为我的精益单线。

标签: php csv explode string


【解决方案1】:

你的代码应该是这样的:

$data = "google,facebook,youtube,twitter,bing";
$exp = explode(",",$data);

foreach($exp as $key => $item)
{
   if(trim($item) == "facebook")
   {
       unset($exp[$key]); //Remove from teh array.
   }
}

$final = implode(",",$rep);
echo $final;

或者只要你的来者之后没有空格,你就可以直接去

$data = str_replace(",facebook,",",",$data);

对于使用str_replace 的许多复杂情况,只需使用循环方法即可。

【讨论】:

  • 查看手册,您可以在数组上使用 str_replace(),而且比手动操作要快得多。
  • 是的,在你发帖之前我才注意到我的错误。
  • array_search() 比循环更有效。看我的回答。
  • array_searchforeach 更*高效*吗?
【解决方案2】:
$data = "google,facebook,youtube,twitter,bing";

$exp = explode(',', $data);
$index = array_search('facebook', $exp);
if ($index !== false){
    unset($exp[$index]);
}

$final = implode(',', $exp);

http://php.net/array-search

【讨论】:

  • 如果 facebook 不在 csv 中,那么 array_search 将返回 false,我们都知道 php 对 falsies 没有那么严格,所以 false 将被解释为 0 从而删除第一个元素的$exp。 > codepad.org/5GTBp1r4
【解决方案3】:

您可以使用array_filter($data)从数组中删除空元素:

$data = str_replace("facebook", "", "google,facebook,youtube,twitter,bing");

$exp = array_filter(explode(",",$data));

$final = implode(",",$rep);

echo $final;

http://php.net/manual/en/function.array-filter.php

“如果没有提供回调,所有等于 FALSE 的输入条目(请参阅转换为布尔值)都将被删除。”

这就是你要找的吗?

【讨论】:

  • 第 1 行删除了“facebook”,因此数组看起来像“”google,facebook,youtube,twitter,bing”。下一行将其转换为数组,删除空值(其中的空格facebook曾经是)。然后内爆将它重新组合在一起。不像正则表达式查找/替换那么简单,但确实使用了您现有的代码结构。
  • 如果其中一项是"barfacebookfoo",则会中断。
  • @Jonah,如果 limo 需要匹配 "barfacebookfoo",他们可以轻松地将第 1 行更改为使用 preg_replace()\w*facebook\w* 之类的模式。
【解决方案4】:

有很多方法可以做到这一点,但也许最简单的方法就是:

$data = str_replace(',,', ',', $data);

【讨论】:

    【解决方案5】:
    $data = "google,facebook,youtube,twitter,bing";
    
    $final = preg_replace("/(^facebook,?|,facebook,|,facebook$)/", "", $data);
    

    或者:

    $final = implode(',', preg_grep("/^facebook$/", explode(',', $data), PREG_GREP_INVERT));
    

    preg_grep()

    【讨论】:

    • Rally,你选择了preg_replace() 而不是str_replace() 甚至str_replace() 可以处理数组。
    • @RobertPitt:如果你看,你会发现他使用了一些正则表达式来确保它不会删除部分项目。
    • 但只要 csv 不变,就没有必要。
    • @Orbling:呃,哦,"google,foofacebook,youtube,twitter,bing" 打破它。
    • @Orbling:这行得通:(,facebook,)|(\Afacebook,)|(,facebook\Z)|(\Afacebook\Z)
    【解决方案6】:

    RobertPitt 的答案是唯一一个费心循环并且比必要的更复杂的答案。 Jonah 和 Colin O'Dell 的方法很有趣,但也比必要的要重。

    Orbling 与他的 preg_replace 方法非常接近,它去掉了太多逗号,也没有考虑到 needle 是唯一值的可能性。

    str_replacepreg_replace 都有一个明显的优势,那就是不用打扰 explodeimplode。这需要是此页面上答案的主要分隔符。将字符串转换为数组再转换回字符串的方法(更不用说额外的处理)将比_replace 方法效率低。

    我还要注意,没有人在他们的 explode/implode 方法中提到 array_diff,所以我会将它包含在我的方法列表中,即使它依赖于 explodeimplode。这纯粹是为了演示。

    如果 needle 是另一个值的子字符串,则所有 str_replace 方法都可能不可信。因为 OP 的示例输入在这方面没有提供冲突,所以我构建了一个 str_replace 方法。

    我的单行 preg_replace 方法是精简而可靠的。

    echo preg_replace("/,facebook\b|\bfacebook,|\bfacebook\b/","",$data);
    

    通过使用字边界 (\b),我的正则表达式模式可以防止针存在于另一个值中的可能性。 See 通过以逗号开头,然后是结尾逗号,然后没有逗号来检查针;如果字符串中唯一的值是针,则该模式仍然有效。最后,如果 csv 字符串中不存在针头,则没有错误。这是 SO 读者应该实施的答案。

    如果您是动态生成针,您可以通过两种方式声明您的模式:

    $needle="facebook";
    
    echo preg_replace("/,$needle\b|\b$needle,|\b$needle\b/","",$data);
    // OR
    echo preg_replace("/,".$needle."\b|\b".$needle.",|\b".$needle."\b/","",$data);
    

    (Demo)


    我的第二名使用str_replace

    $args=[["facebook",",,"],["",","]];
    echo trim(str_replace($args[0],$args[1],$data),",");
    

    它替换facebook,然后用单个逗号替换任何双逗号,然后从结果字符串中剪掉任何前导或尾随逗号。


    排在第三位的是explode->array_diff->implode 作为单线:

    echo implode(',',array_diff(explode(',',$data),["facebook"]));
    

    这是一个紧凑的单线,但仍然要费心去爆炸、过滤和内爆。

    这里是my testing ground,我在这里介绍了所有三种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2015-07-16
      相关资源
      最近更新 更多