Javascript 正则表达式替换JS文件中的部分字符串

Javascript 正则表达式替换JS文件中的部分字符串,javascript,php,regex,preg-replace,Javascript,Php,Regex,Preg Replace,我有以下PHP正则表达式问题,这可能是不可能解决的 我需要通过用函数调用替换某些子字符串来预处理JS文件 所以基本上把这个转过来: var s = "I'll sleep all day when I'm tired"; 为此: var s = "I'll sleep all "+getPreference()+" when I'm tired"; 到目前为止,唯一的问题是我不知道在原始JS中使用哪种引号作为字符串分隔符 字符串也可以如下所示: var s = 'I\'ll sleep al

我有以下PHP正则表达式问题,这可能是不可能解决的

我需要通过用函数调用替换某些子字符串来预处理JS文件

所以基本上把这个转过来:

var s = "I'll sleep all day when I'm tired";
为此:

var s = "I'll sleep all "+getPreference()+" when I'm tired";
到目前为止,唯一的问题是我不知道在原始JS中使用哪种引号作为字符串分隔符

字符串也可以如下所示:

var s = 'I\'ll sleep all day when I\'m tired';
这将导致:

var s = 'I\'ll sleep all "+getPreference()+" when I\'m tired';
当JS被执行时,它会将我的函数调用显示为字符串的一部分

长话短说,我需要一种安全的方法来确定使用了哪个字符串分隔符(“or”),然后相应地修改替换字符串

如果这里有任何雷格士天才有想法,我们将不胜感激

更新:

非常感谢迄今为止的帮助。 我觉得我没有给出足够的背景

  • 正则表达式应该在PHP(预处理JS)中完成,而不是通过JS中的函数完成
  • 我不知道关于JS的任何事情,也不能假设它是有效代码(例如字符串的开头或结尾)
  • 我完全知道该换什么,这不是问题所在
考虑这个例子:

     message = Theme.addToCartSuccess.replace("**product**", 
     item.title).replace(
     "**cart_link**", 
     "<a href=\"/cart\">\n    REPLACE_ME\n</a>")
     .replace("**continue_link**", 
     "<a\n    href=\"/collections/all\"\n>\n    
     REPLACE_ME\n</a>").replace("**checkout_link**", "<a 
     href=\"/checkout\">\n    REPLACE_ME\n</a>");
      return setTimeout(function() {
       _this.productMessages.html(message).addClass("success- 
      message").removeClass("error-message");
message=Theme.addToCartSuccess.replace(“**产品**”,
项目名称)。替换(
“**购物车链接**”,
"")
.replace(“**继续链接**”,
)。替换(“**签出链接*”,“”);
返回setTimeout(函数(){
_this.productMessages.html(message.addClass)(“成功-
消息“).removeClass(“错误消息”);
在上面的示例中,我需要用getVar()替换字符串replace_ME

更新2:

我觉得解决这个问题的唯一方法是从替换字符串中回溯并分析可能的分隔符:

\“>分隔符必须为”
\“>分隔符必须是”
'或“>可以是,回溯到;之前的最后一个引号;>必须是分隔符

想法

谢谢,
Tom

使用捕获组和反向引用:

var line='var s=“我累了的时候会睡一整天”
new_line=line.replace(/([“'))(我会全部睡眠)。*(当我*累了的时候)\1;/,“$1$2$1+getPreference()+$1$3$1;”;
控制台日志(新的_行);
line=“var s=‘我累了就睡一整天’
new_line=line.replace(/([“'))(我会全部睡眠)。*(当我*累了的时候)\1;/,“$1$2$1+getPreference()+$1$3$1;”;
console.log(新的_行);
给你

function test( $string ){
    $pattern = '/^(var\s+s\s*=\s*)(\'|")(.+)(day)(.+\2\s*;)/';
    echo preg_replace_callback($pattern, function($match){
        return $match[1].$match[2].$match[3].$match[2].'+getPreference()+'.$match[2].$match[5];
    }, $string);
    echo "\n";
}
我假设您想用该函数替换
day

你可以测试一下

测试字符串如下所示

test( <<<STR
var s = "I'll sleep all day when I'm tired";
STR
);

test( <<<STR
var s = 'I\'ll sleep all day when I\'m tired';
STR
);
顺便说一句,你可以不用调用preg\u replace\u callback来完成它,我只是想让它更花哨,因为这看起来很无聊

function test( $string ){
    $pattern = '/^(var\s+s\s*=\s*)(\'|")(.+)(day)(.+\2\s*;)/';
    echo preg_replace($pattern, '\1\2\3\2'.'+getPreference()+'.'\2\5', $string);
    echo "\n";
}
当然,这对于这个答案是非常具体的,它只适用于
var s=
something
day
something……但是您必须为它提供更多的上下文,使其更通用

更新

我将此
(var\s+s\s+=\s+
更改为此
(var\s+s\s*=\s*)
,因为您可以使用不带空格的
var s=“…”


干杯。

我想主要的问题不是引号,而是这个函数应该插入到哪里。快速提问。你能不能在结尾
之前简单地检查一下分隔符的类型?那很简单,给我几分钟,你怎么知道在哪里插入它。Regex不是一个处理JavaScript的合适工具。你需要分析一下重新编译它。或者只是运行“预处理”在源代码中查找并替换一次,也许……不要担心在哪里插入函数调用,这不是问题所在。我在这里对它进行了强烈的简化,但只是假设需要替换的总是“day”这个词。一个肮脏的、快速的回答只是为了说明它的工作原理。这不是一个好主意。这是为了说明背后的原理使用捕获组。我真的不知道他到底想匹配什么。对不起,我不记得我以前是否投过你的反对票。但这次我投了。
function test( $string ){
    $pattern = '/^(var\s+s\s*=\s*)(\'|")(.+)(day)(.+\2\s*;)/';
    echo preg_replace($pattern, '\1\2\3\2'.'+getPreference()+'.'\2\5', $string);
    echo "\n";
}