【问题标题】:Replace value of variable in JS file using Regex in php使用 php 中的正则表达式替换 JS 文件中变量的值
【发布时间】:2022-01-06 13:36:17
【问题描述】:

我想使用php更改js文件中变量的值,到目前为止我尝试的是获取文件内容并尝试找到一个强大的正则表达式来更改变量的值:

这里是js文件的内容,记住值可以是=;之间的任意值

// blah blah blah

const filename = ""; // it can be filename = ''; or filename = null; or filename = undefined; and so on

// blah blah blah

我试图用这个得到准确的线:preg_match

/(((\bconst\b)+\s*(\bfilename\b)+\s*)+\s*=)[^\n]*/is

然后用这个替换值:preg_replace

/([\"\'])(?:(?=(\\?))\2.)*?\1/is // to get what is between ""
or
/(?<=\=)(.*?)(?=\;)/is // to get what is between = & ;

然后使用第一个公式再次替换文件中的整行:preg_replace

/(((\bconst\b)+\s*(\bfilename\b)+\s*)+\s*=)[^\n]*/is

我在问他们是不是更好的方法,因为我觉得这是太多的工作,并且不确定我到目前为止所做的优雅和性能!

注意:它是一个汇总配置文件,将从当前 php 方法的控制器/方法中获取捆绑文件名 >> 这是一个特定的场景。

【问题讨论】:

  • 这样做的目的是什么?如果你想让你的 PHP 向 JS 传递一个值,那绝对不是正确的做法。
  • 通常你不应该尝试用任何东西来解析 JavaScript,只需要一个合适的解析器。否则你会很难过。提一些容易处理的陷阱:const not_filename = 0;const not_fn = "filename = im_a_string";const a = 1, filename = 'path', c = 3
  • 我有一个特定的场景,我知道通常你不想在运行时将任何东西传递给像这样的 js 文件,但这不是在运行时,它是一个配置 js 文件,它会改变编译前一次传递文件名。

标签: javascript php regex svelte rollupjs


【解决方案1】:

你可以使用

preg_replace('~^(\h*const\s+filename\s*=\s*).+~mi', '$1"NEW VALUE";', $string)

请参阅regex demo详情

  • ^ - 以行开头(由于 m 标志)
  • (\h*const\s+filename\s*=\s*) - 第 1 组:零个或多个水平空格 (\h*)、const、一个或多个空格 (\s+)、filename=,由零个或多个空格包围 (@987654332 @)
  • .+ - 一个或多个除换行符以外的字符,尽可能多。

替换包含$1,将第 1 组的内容插入到结果字符串中的替换反向引用。

PHP demo

$string = "// blah blah blah\n\nconst filename = \"\";\n\n// blah blah blah";
echo preg_replace('~^(\h*const\s+filename\s*=\s*).+~mi', '$1"NEW VALUE";', $string);

输出:

// blah blah blah

const filename = "NEW VALUE";

// blah blah blah

【讨论】:

    【解决方案2】:

    好的,我不知道我是否理解你想说的是否正确,但在这里我试图回答你的问题。

    因此,您想使用 php 更改存储在 const filename = ""; 中的值。

    这是您的 javascript 文件的外观:

    // blah blah blah
    
    const filename = ""; 
    
    // blah blah blah
    

    现在,我们必须获取存储在 const filename 中的值。所以,我们的 php 应该是这样的:

    $newFilename = 'this_will_replace_the_value_in_const_filename';
    $replace = get_file_contents('path_to_the_js_file');
    
    $replaced = preg_replace('/\s*const\s+filename\s*=\s*\"(.*)\"\s*\;/', "const filename = '$newFilename';", $replace)
    

    现在,具有const filename 操作值的新字符串存储在$replaced 中。您可以使用 echo 打印它,如下所示:

    //php
    echo $replaced;
    

    输出:

    // blah blah blah
    
    const filename = 'this_will_replace_the_value_in_const_filename'; 
    
    // blah blah blah
    

    【讨论】:

    • 添加新答案作为对不同答案的评论很容易丢失。我建议在您有其他问题的答案上添加 cmets。或者在原始问题的底部添加一个附加部分以及后续问题,以便清楚历史是什么。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2012-01-04
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多