php 从字符串中删除,关于php:从字符串中删除值

如果我有一个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,因此没有逗号怎么办?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值