PHP正则表达式取代'减去'

时间:2017-10-02 14:42:25

标签: php

我正在尝试删除'减号'从一个字符串,但如果有三个顺序我想保留一个。

例如:

today-is---sunny--but-yesterday---it-wasnt

成为:

today is - sunny but yesterday - it wasnt

我试图str_replace - 但显然是删除所有这些。

基本上我想按顺序删除最多2个。如果有更多的话,请保留它。

7 个答案:

答案 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);

Seems to work

答案 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;

输出是:

  

今天是 - 晴天但昨天 - 它不是 - 没有 - 五 -

DEMO

因此它匹配1或2个短划线,后跟短划线并替换为空格。在超过2个连续短划线的情况下,这意味着它仅匹配连续字符串中的最后2个。然后我们匹配一组一个或多个破折号,并在其前面加一个空格。

答案 4 :(得分:0)

分三步完成:

  • 首先将'/---+/'替换为'@minus@'(或其他一些可识别的占位符)
  • 然后将所有/[- ]+/替换为' '(一个空白)
  • 将所有'@minus@'替换为' - '

答案 5 :(得分:-1)

只需替换所有“ - ”Occurence,你应该只在那之后得到“ - ”

答案 6 :(得分:-2)

您是否尝试过str_replace(&#34; ---&#34;,&#34; - &#34;,$ string)?这样,如果顺序中有三个减号,它们将只被一个减去。