从字符串中删除值

时间:2011-01-22 14:30:48

标签: php regex string

如果我有一个带ID的字符串

$myIDs = '22,34,445,67889,23';

我给了一个值,如何将其从字符串中删除,假设我确定它在字符串中?

$removeID = '445';

我是否使用preg_replace或是否有更好的方法?例如,如果它位于字符串的中间并且我只删除了一个值,那么我最终会得到两个逗号,然后我需要用一个逗号替换它们?

preg_replace($removeID, '', $myIDs);

更新:这些都是很棒的建议。但是,我只想到了一个潜在的问题。这可能需要作为数组而不是正则表达式处理。我的字符串是什么样的

$myIDs = '2312,23,234234';

和要移除的ID

$removeID = '23';

潜在的匹配太多......

7 个答案:

答案 0 :(得分:3)

$array = explode(',',$myIDs);
$array = array_diff($array,array($removeID));
$output = implode(',',$array);

答案 1 :(得分:3)

您可以使用正则表达式:

$remove = preg_quote($removeID, '/');
$regex = '/,'.$remove.'$|^'.$remove.',|^'.$remove.'$|,'.$remove.'(?=,)/';
$myIDs = preg_replace($regex, '', $myIDs);

基本上说:替换$removeID,它以字符串的开头或逗号为前缀,后缀为字符串的结尾或另一个逗号。

编辑:我已将正则表达式更改为经过测试的正则表达式(我已经测试了所有可能性,它似乎适用于我能想到的所有情况)...

答案 2 :(得分:2)

这是项目“89”的正则表达式:

/(^|,)89(?=,|$)/

它匹配“,89”(或者只是“89”,如果它在输入的开头),只要它直接跟随另一个“,”或输入的结尾。

适当的转义和一些抽象:

<?php
$myIDs = '23,45,678967,89,12';
$toRemove = 89;

$myIDs = preg_replace('/(^|,)' . preg_quote($toRemove) . '(?=,|$)/', '', $myIDs);
?>

使用多个输入进行测试。

希望有所帮助!

答案 3 :(得分:1)

$myIDs = '1,2,3,4,5';
$remID = '5';

$myIDs = preg_replace(array("/^$remID,|(?:,|^)$remID$/","/,$remID,/"),
                      array('',','),
                      $myIDs);

Ideone Link

答案 4 :(得分:1)

$myarray=explode(',', $myIDs)
$excluded=preg_grep('^' . $removeID . '$', $myarray, PREG_GREP_INVERT)
$newId=join(',', $excluded)

答案 5 :(得分:1)

我也要提出一个解决方案:

preg_replace( '/\b(,' . $rID . '|' . $rID . ',|' . $rID . ')\b/', '', $myIDs );

preg_replace( '/\b(,445|445,|445)\b/', '', $myIDs );

example

答案 6 :(得分:-1)

最简单的方法是:

$myIDs = '22,34,445,67889,23';
$removeID = 445;

$myIDs = preg_replace("/($removeID,|,$removeID)/", '', $myIDs);

<强>更新

$myIDs = preg_replace("/(^$removeID,|,$removeID$|,$removeID(?=,))/", '', $myIDs);