我正在尝试删除'减号'从一个字符串,但如果有三个顺序我想保留一个。
例如:
today-is---sunny--but-yesterday---it-wasnt
成为:
today is - sunny but yesterday - it wasnt
我试图str_replace - 但显然是删除所有这些。
基本上我想按顺序删除最多2个。如果有更多的话,请保留它。
答案 0 :(得分:4)
不够聪明,无法将其变成一个正则表达式,所以在这里2:
$string = "today-is---sunny--but-yesterday---it-wasnt";
$string = preg_replace("/\b-{1,2}\b/", " ", $string);
$string = preg_replace("/\b-{3,}\b/", " - ", $string);
答案 1 :(得分:3)
我会使用正则表达式分两步完成。
首先,如果1或2被单词边界包围,则用空格替换负号。
preg_replace("/(\b(-){1,2}\b)/", " ", $string);
模式(regex101):
word boundry | minus sign (1 or 2) | word boundry
然后,用空格包围的减号替换3个或更多减号的所有实例。
preg_replace("/(\b(-){3,}\b)/", " - ", $string);
模式(regex101):
word boundry | minus sign (3 or more) | word boundry
注意:我的示例代码模式中没有括号,buet我相信它们有助于提高可读性。
我个人喜欢regex101使用给定模式准确显示网站右上角发生的事情的方式,所以如果您想了解更多关于这个(或其他正则表达式模式)如何工作的信息,然后regex101是一个很好的资源。
答案 2 :(得分:2)
回调解决方案:
$new = preg_replace_callback(
'/[-]+/',
function ($m) {
return 2 < strlen($m[0])? ' - ' : ' ';
},
'today-is---sunny--but-yesterday---it-wasnt'
);
// today is - sunny but yesterday - it wasnt
答案 3 :(得分:1)
好的,我认为这会处理您的更新提到的案例
$string = "today-is---sunny--but-yesterday---it-wasnt----nothing-----five";
$newstring = preg_replace("/(\-{1,2})(?!\-)/", " ", $string);
$newstring = preg_replace("/(\-+)/", " $1", $newstring);
echo $newstring;
输出是:
今天是 - 晴天但昨天 - 它不是 - 没有 - 五 -
因此它匹配1或2个短划线,不后跟短划线并替换为空格。在超过2个连续短划线的情况下,这意味着它仅匹配连续字符串中的最后2个。然后我们匹配一组一个或多个破折号,并在其前面加一个空格。
答案 4 :(得分:0)
分三步完成:
'/---+/'
替换为'@minus@'
(或其他一些可识别的占位符)/[- ]+/
替换为' '
(一个空白)'@minus@'
替换为' - '
答案 5 :(得分:-1)
只需替换所有“ - ”Occurence,你应该只在那之后得到“ - ”
答案 6 :(得分:-2)
您是否尝试过str_replace(&#34; ---&#34;,&#34; - &#34;,$ string)?这样,如果顺序中有三个减号,它们将只被一个减去。