仅删除特定字符之间的空格

时间:2014-05-30 23:36:03

标签: php regex

我只需删除特定字符之间的一些空格。 这是我的数据:

#1 2 5 1#
#   5 5 3#: 100% #5 55#
#554     #: 23    
#559#: 30%
#4 79#: 2 0 0#%
#473#: 20 #47  4#
#4  7  4 43 33 5 5#: 15s
#4 79#: 195%
#473#: 20 # 474#
#475#: 14.5s

我想要删除两个##标签之间的所有空格,这些空格不会被除数字以外的任何内容分隔开。 我的数据应如下所示:

#1251#
#553#: 100% #555#
#554#: 23    
#559#: 30%
#479#: 2 0 0#%
#473#: 20 #474#
#474433355#: 15s
#479#: 195%
#473#: 20 #474#
#475#: 14.5s

我目前正在尝试在PHP中使用以下正则表达式来preg_replace那些空格,但是,我尝试过的所有内容都不成功。

(?:[#])(?:([\s])*[0-9]*)*(?:[#])

Regular expression visualization

Debuggex Demo

2 个答案:

答案 0 :(得分:3)

此正则表达式针对您想要的所有空间。您可以preg_replace使用空字符串。

(?:#|\G)\d*\K\s+(?=[\d\s]*#)

请参阅demo

作为第二种选择,由于您的行似乎是从#开始,为了避免#之间的不平衡,您还可以使用:

(?m)(?:^#|\G)\d*\K\s+(?=[\d\s]*#)

<强>解释

(?:#|\G)\d*\K\s+(?=[\d\s]*#)
  • 匹配(?:#|\G)下面的正则表达式
    • 匹配此备选方案(仅在此方案失败时尝试下一个备选方案)#
      • 匹配字符“#”字面#
    • 或者匹配此替代方案(如果此组无法匹配则整个组都会失败)\G
      • 在匹配尝试开始时断言位置(第一次尝试的字符串的开头)\G
  • 匹配单个字符“数字”(任何Unicode脚本中的0-9)\d*
    • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)*
  • 保持文本匹配到目前为止的整个正则表达式匹配\K
  • 匹配单个字符“空格字符”(任何Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行)\s+
    • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)+
  • 断言下面的正则表达式可以匹配,从这个位置开始(正向前瞻)(?=[\d\s]*#)
    • 匹配以下列表中的单个字符[\d\s]*
      • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)*
      • “数字”(任何Unicode脚本中的0-9)\d
      • “空格字符”(任何Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行)\s
    • 匹配字符“#”字面#

答案 1 :(得分:1)

您可以将preg_replace_callback()与以下正则表达式一起使用:

/^#.*?#:?/m

用简单的英语:断言字符串开头的位置,匹配单个#字符,后跟除换行符之外的任何字符,直到下一个#,尽可能匹配(懒惰匹配) 。然后匹配:(如果找到)。 m修饰符用于启用多行匹配。

基本上,表达式匹配第一个#和第二个#之间的所有内容。找到匹配后,会将其传递给回调函数,其中使用str_replace()删除所有空格。

preg_replace_callback('/^#.*?#:?/m', function ($matches) {
    return str_replace(' ', '', $matches[0]);
}, $text);

Demo

相关问题