如果我有一个ID字符串
$myIDs = '22,34,445,67889,23';
并且给了我一个值,假设我确定它在字符串中,那么如何从字符串中删除它?
$removeID = '445';
我使用preg_replace还是有更好的方法? 例如,如果它在字符串的中间,而我只删除了一个值,那么我将以两个逗号结尾,然后我需要用一个逗号替换那些逗号?
preg_replace($removeID, '', $myIDs);
更新:这些都是很好的建议。 但是,我只是考虑了一个潜在的问题。 这可能需要作为数组而不是正则表达式来处理。 我的绳子是什么样子
$myIDs = '2312,23,234234';
和要删除的ID
$removeID = '23';
潜在的比赛太多...
关于您的更新:以下几乎所有答案都已经考虑了这种可能性。 因此,是的,如下所示,使用正则表达式绝对可以做到这一点。
您可以使用正则表达式:
$remove = preg_quote($removeID, '/');
$regex = '/,'.$remove.'$|^'.$remove.',|^'.$remove.'$|,'.$remove.'(?=,)/';
$myIDs = preg_replace($regex, '', $myIDs);
基本上是这样说的:替换$removeID,在其前面加上字符串的开头或逗号,并在后面加上字符串的末尾或另一个逗号。
编辑:我已经将正则表达式更改为经过测试的正则表达式(我已经测试了所有可能性,并且它似乎在我能想到的所有情况下都有效)...
但是如果2被删除,这是否会使1,2,3变为13?
但是现在它将,,留在那里。 (这是预期的吗?)也许是,RM$|(?<=^|,)RM,吗?看起来不太好,但是应该正确删除逗号。
现在它不会删除第一个值,我的建议是:$regex = (^.$remove.,|,.$remove.(?=,)|(,|^).$remove.$);
$array = explode(',',$myIDs);
$array = array_diff($array,array($removeID));
$output = implode(',',$array);
这是数据列表,因此最简单的操作方法是使用数组!
根据字符串的大小,这可能会变得效率低下。我不愿意看到这样的事情来完成一个100k id的字符串...
同意,但是对于@santas数据集可以。还有在使用数组或使用正则表达式之间进行内存/ cpu折衷的业务。
@fredley:我很好奇,所以我整理了一个简单的基准脚本。数组操作的速度大约是我想出的正则表达式的两倍。 Def进行了微优化,但它只是表明它确实没有比regex(受cpu约束,这是内存和cpu约束)更有效。
@ircmaxell:您的测试ID字符串持续了多长时间?
@poke:上面给定的字符串。 Ive还使用500元素进行了测试,它花费的时间是正则表达式的3倍...
这是用于项目" 89"的正则表达式:
/(^|,)89(?=,|$)/
它与",89"匹配(如果在输入的开头,则匹配" 89"),只要它后面直接跟着另一个","或输入的结尾即可。
通过适当的转义和一些抽象:
$myIDs = '23,45,678967,89,12';
$toRemove = 89;
$myIDs = preg_replace('/(^|,)' . preg_quote($toRemove) . '(?=,|$)/', '', $myIDs);
?>
经过多个输入测试。
希望有帮助!
实际上,字符串可以采用以下格式:89或1,89,3或1,89或89,3,即,可以(在|之后)有逗号或根本没有逗号。
@ircmaxell:否。最后的捕获是超前断言。
@ircmaxell:自己尝试一下:regular-expressions.info/javascriptexample.html
我也将提出一个解决方案:
preg_replace( '/\b(,' . $rID . '|' . $rID . ',|' . $rID . ')\b/', '', $myIDs );
即
preg_replace( '/\b(,445|445,|445)\b/', '', $myIDs );
(例)
$myarray=explode(',', $myIDs)
$excluded=preg_grep('^' . $removeID . '$', $myarray, PREG_GREP_INVERT)
$newId=join(',', $excluded)
在数组元素上运行正则表达式,基本上只检查是否相等?这是非常低效的。将array_filter与仅检查相等性的简单回调函数一起使用会更好。
$myIDs = '1,2,3,4,5';
$remID = '5';
$myIDs = preg_replace(array("/^$remID,|(?:,|^)$remID$/","/,$remID,/"),
array('',','),
$myIDs);
Ideone链接
如果您有$myIDs = 1, 2, ,500;会怎样?您将以1,2, ,00结束...
@ircmaxell为什么该字符串必须为1, 2, ,500?我假设我们假设该字符串正确列出了用逗号分隔的数字。
这就是我考虑的一系列模式和替换的想法,但是您击败了我。
从正则表达式的第一个选项中删除?。否则5将匹配500,10,11。
最简单的方法是这样的:
$myIDs = '22,34,445,67889,23';
$removeID = 445;
$myIDs = preg_replace("/($removeID,|,$removeID)/", '', $myIDs);
更新:
$myIDs = preg_replace("/(^$removeID,|,$removeID$|,$removeID(?=,))/", '', $myIDs);
例如,不能使用值889的$removeID。
我喜欢简单,但是如果字符串只有一个ID,因此没有逗号怎么办?