现在有这么一段字符串:
abcxyz
qwerty
[abc]aaaaaaaa
bbbbbbbbb
ccccccccc[/abc]
poiuyt
lkjhgf
[abc]
dddddd
eeeeeee
ffff[/abc]
poiuy
asdfg我希望用个正则表达式,把[abc]和[/abc]之间的换行符(也就是\r\n)给替换掉。但是[abc]和[/abc]之外的字符串的换行符保留不变。
上面的是个例子,有可能是这种情况[abc]xxxx[/abc][abc]......,也就是前一个[/abc]和后一个[abc]紧挨着。如果能兼容linux和windows(换行符好像不一样),就更完美了。弄了一晚上,请教了群友,仍然没有解决,只好来麻烦大家了。

解决方案 »

  1.   

    如果没有嵌套:
    preg_replace_callback( '~\[abc\](.*?)\[/abc\]~msi',
                           function($matches){
                              return str_replace(array("\r","\n"),'',$matches[0]);
                           },
                           $text);
      

  2.   

    谢谢楼上的回复。
    这段代码把[abc]之外的字符都删除了。
      

  3.   

    $s =<<< TXT
    abcxyz
    qwerty
    [abc]aaaaaaaa
    bbbbbbbbb
    ccccccccc[/abc]
    poiuyt
    lkjhgf
    [abc]
    dddddd
    eeeeeee
    ffff[/abc]
    poiuy
    asdfg
    TXT;echo preg_replace('#\[abc].+?\[/abc]#se', 'preg_replace("/[\r\n]+/","","$0")', $s);
    abcxyz
    qwerty
    [abc]aaaaaaaabbbbbbbbbccccccccc[/abc]
    poiuyt
    lkjhgf
    [abc]ddddddeeeeeeeffff[/abc]
    poiuy
    asdfg其实 helloyou0 是对的,只是他没有注意到你的 [abc] 是两段
      

  4.   

    谢谢楼上的几位朋友。
    那行代码用的修正符e就是可以对匹配项再编辑是吧?昨晚想一次性把[abc]里的东西替换呢,结果没弄出来。呵呵。
      

  5.   

    修正符e 的作用于 js 里的正则一样,都可执行简单的语句如果要对匹配到的内容做较复杂的处理,那势必要写个函数
    这时 preg_replace_callback 的威力就显现出来了
      

  6.   

    preg_replace_callback 这个没用过。学习了。
    感谢各位高手的解答。