如何在字符-第二次出现后剥离字符串中的所有内容? 例如:Today is - Friday and tomorrow is - Saturday 我希望删除Saturday沿着最后一个连字符:- Saturday 我似乎只能在第一个-之后删除所有内容。 预期结果是:Today is - Friday and tomorrow is
$str = 'Today is - Friday and tomorrow is - Saturday';
$sliceWith = "-"; // character to split by
$beginWith = 0; // 1 removes before first match, 0 will not
$splitAfter = 2; // number of matches to keep
$result = implode($sliceWith, array_slice(explode($sliceWith, $str), $beginWith, $splitAfter));
echo $result; // You might want to use trim($result)
7条答案
按热度按时间laawzig21#
使用strpos查找第一个匹配项,然后再次使用它查找结束点(使用偏移选项和上一个值)。然后使用substr。
mcvgt66p2#
关于爆炸:
9bfwbjaz3#
strtok
:DEMO
ql3eal8s4#
对于其他有同样问题的人;我使用了这种紧凑的解决方案,很容易调整。
7rtdyuoh5#
可以使用explode()在每次出现“-"时拆分字符串。例如:
会给你留下:
因此,您想要的位将是中间带有“-”的前两个元素,因此我们可以从数组中弹出最后一个元素并连接其余元素:
其给出:
rqenqsqc6#
我发现正则表达式模式的控制和简洁性对这项任务最有吸引力。
匹配零个或多个非连字符,然后匹配一个连字符(N次; 2),在最后一个连字符匹配之前用
\K
重置整个字符串匹配,然后匹配剩余的字符。如果字符串中的连字符少于N个,则此方法不会删除任何字符。
代码:(Demo)
如果你想在第二个连字符后删除尾随空格,你可以将其添加到模式中,而不是在返回的字符串上调用
rtrim()
。(Demo)我个人并不喜欢这样的想法:调用三个函数来生成一个临时数组,然后只保留前两个元素,然后重新加入数组成为一个连字符分隔的字符串,但是如果你非常讨厌正则表达式,想要这种方法,你应该限制爆炸的数量为N+1,这样就不会创建不必要的元素。(Demo)
tyg4sfes7#
strpos
substr