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

时间:2018-04-25 17:32:02

标签: javascript php regex preg-replace

我有以下PHP Regex问题,可能无法解决。

我需要通过用函数调用替换某些子字符串来预处理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时将我的函数调用显示为字符串的一部分。

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

这里有任何想法的正则表达式天才吗?非常感谢帮助。

更新

非常感谢你们的帮助。 我觉得我没有给出足够的背景。

  • 正则表达式应该在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");

在上面的例子中,我需要用getVar()

替换字符串REPLACE_ME

更新2:

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

\“&gt;分隔符必须为”
\'&gt;分隔符必须是'
'或'&gt;可以是,进一步回溯,直到我们点击;&gt;最后一个引用;必须是分隔符。

思想?

谢谢, 汤姆

2 个答案:

答案 0 :(得分:0)

使用捕获组和反向引用:

var line = 'var s = "I\'ll sleep all day when I\'m tired";'
new_line = line.replace(/(["'])(I.*ll sleep all ).* (when I.*m tired)\1;/, "$1$2$1 + getPreference() + $1$3$1;");
console.log(new_line);

line = "var s = 'I\\'ll sleep all day when I\\'m tired';"
new_line = line.replace(/(["'])(I.*ll sleep all ).* (when I.*m tired)\1;/, "$1$2$1 + getPreference() + $1$3$1;");
console.log(new_line);

在正则表达式中,您可以参考使用\1捕获第1组,在替换中使用$1

答案 1 :(得分:0)

你去吧

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

您可以对其进行测试here

测试字符串是这些

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
);

不要担心<<<这是HEREDOC我真的不想解释它,它只是一种无需麻烦的方式来做弦乐的方法报价。

哦,输出就是这个

var s = "I'll sleep all "+getPreference()+" when I'm tired";
var s = 'I\'ll sleep all '+getPreference()+' when I\'m tired';

PS。你可以在没有preg_replace_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 =某事day某事......但是你必须让更多的背景让它变得更通用。

<强>更新

我将此(var\s+s\s+=\s+)更改为此(var\s+s\s*=\s*),因为您可以var s="..."没有空格。

干杯。