如何跳过特定行preg_replace-PHP

如何跳过特定行preg_replace-PHP,php,regex,Php,Regex,我制作了一个小函数,用于从字符串中删除额外的空格 /* remove white space */ function wspace($string){ $string = preg_replace( '/\s+/', ' ', $string); return $string; } 它工作得很好,但我的问题如下; 如果我打算在js字符串上使用此函数,那么包含以下逗号的行 // will brake js output, 范例 $js_string .="

我制作了一个小函数,用于从字符串中删除额外的空格

/* remove white space */
function wspace($string){

    $string = preg_replace( '/\s+/', ' ', $string);
    return $string;
}
它工作得很好,但我的问题如下; 如果我打算在js字符串上使用此函数,那么包含以下逗号的行

// will brake js output, 
范例

      $js_string .="
        window.addEvent('load', function(){
            new Drop({
                container:'container',
                offset: ".$offset.", // top menu offset
                width:200
            });
        });
      ";

echo wspace( $js_string );
这将输出

window.addEvent('load', function(){ new Drop({ container:'container',offset: ".$offset.", // top menu offset width:200 }); });";
/

我将如何跳过这些行或用
/*
或任何不会弄乱其余代码的内容替换这些行

我知道用
/*
注释
*/
替换
/
是应该做的,但我正在更新我广泛使用的旧脚本,我不知道用户是否有
/
或/
*
注释
*/
。所以为了不破坏别人的代码,我需要在发布这个之前确定一下

我想做一些像

或者任何你认为能让这个功能更安全的东西

感谢您的帮助。谢谢大家!

你可以试试这个。可以将数组作为模式并替换

function wspace($string){
    $string = preg_replace( array('/[^:]\/\/.*$/m','/\/\*.*\*\//U', '/\s+/'), array('','',' '), $string);
    return $string;
}
编辑:

如果还要删除/*…*/脚本中的注释,您可以使用

function wspace($string){
    echo $string;
    $string = preg_replace( array('/[^:]\/\/.*$/m','/\/\*.*\*\//U', '/\s+/'), array('','',' '), $string);
    return $string;
}
注意:我没有在真正的javascript函数上测试这些函数。

编辑:使其安全。

您可以使用以下模式:


$pattern=我正在测试它,但还是有什么东西把它弄乱了。啊,发现了问题,有一个包含的变量,所以我得到var sp='http:var tp='它实际上适用于所问的问题,所以你是对的,我如何跳过http://?好的,额外的空间有助于找到类似//space comment和not//comment的注释,它将var留给http://aloneThat这是一些优秀的正则表达式Casimir(一如既往)。我特别喜欢用
(?!\1)[“]”)*\1
来模拟字符类的否定。+1@AmalMurali:谢谢你,也谢谢你的编辑!不过这个模式可以简化。我会改正的。
function wspace($string){
    echo $string;
    $string = preg_replace( array('/[^:]\/\/.*$/m','/\/\*.*\*\//U', '/\s+/'), array('','',' '), $string);
    return $string;
}
$result = preg_replace_callback($pattern, function ($m) {
     return ($m[2]) ? '/* ' . trim($m[2]) . ' */' : ' ';
}, $data);

print_r($result);