我遇到一个比较棘手的难题。
有这样一种字符串: "abcd  ef #[gh i]# jkl #[m n]#op q"
也就是说,这个字符串中有空格,还有用#[ ]#包围起来的子串,子串里面也可能有空格。
现在的要求是,要用正则表达式替换子串外面部分里的空格为  而#[ ]#子串里面如果有空格,不替换。
好难啊,这个应该怎么写呢??

解决方案 »

  1.   

    $str = 'abcd  ef #[g h i ]# jkl #[ m n]#op q';//该方法适合#[ ]#中只有一个空格的情形,如果是#[g h i]#则会被替换成#[g h i]#
    echo preg_replace("/ (?!\w*\]#)/", ' ', $str);//该方法适合所有情形
    $arr = preg_split("/(#\[.*?\]#)/", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
    $output = '';
    for ($i = 0, $j = count($arr); $i < $j; ++$i) {
    if ($i % 2 == 0) $output .= str_replace(' ', '&nbsp;', $arr[$i]);
    else $output .= $arr[$i];
    }
    echo $output;