Php 正则表达式替换:函数调用的字符串

Php 正则表达式替换:函数调用的字符串,php,regex,string,replace,autoit,Php,Regex,String,Replace,Autoit,我的AutoIt脚本有很多字符串。例如: ;This is AutoIt $string1 = "This is a test string" & @crlf & "Wow, autoit syntax!" $string2 = "This string has a var. Var1=" & $var1 $wow = random_function("Another string") & "this is getting complex" magic_funct

我的AutoIt脚本有很多字符串。例如:

;This is AutoIt
$string1 = "This is a test string" & @crlf & "Wow, autoit syntax!"
$string2 = "This string has a var. Var1=" & $var1
$wow = random_function("Another string") & "this is getting complex"
magic_function("var1=" & $var1 & @crlf & "other var=" & $var2)
$multivar = "This string has 2 vars: var1=" & $var1 & " var2=" $var2"
我想用函数调用替换每个字符串。因此,上述脚本将变成:

;This is AutoIt
$string1 = get_string(1) & @crlf & get_string(2)
$string2 = get_string(3,$var1)
$wow = random_function(get_string(4)) & get_string(5)
magic_function(get_string(6,$var1) & @crlf & get_string(7,$var2))
$multivar = get_string(8,$var1,$var2)

两者对我都很好。我正在寻找一个正则表达式解决方案。脚本包含不应该被替换的字符串,但让我来做这部分。我只需要正则部分

我对使用PHP的看法:

//This is php
$file = "test.au3"
$lines = file($file)
foreach($lines as $index => $line){
    $newLine = preg_replace(/*magic regex here*/);
}

可以对每一行进行替换(我没有多行字符串)。

单用正则表达式无法做到这一点。但是,可以使用regex+状态解析来完成

根据您的示例中可能出现的语法情况,我编写了一个脚本来完成这项工作。我是用Python编写的,因为我对该语言比PHP更熟悉,但是如果您无法使用Python来完成此任务,那么代码+注释应该足够清晰,以便有人将其转换为PHP

#/usr/bin/env python
导入文件输入
进口稀土
#可能要修改的值
filename=“test.au3”
replacementFunctionName=“获取字符串”
replacementForConcatenator=“,”
#用于标识原始AutoIt元素的正则表达式
string=r”“(?:“(?:[^”]|“(?=”))*”(?:[^']|“(?=”)*”)““#三个引号就是Python
macro=r“@\w+”#前缀r使\a成为文字(在字符串中,而不是正则表达式中)
变量=r“\$\w+”
串联器=r“\s*&\s*”
#用于标识复合AutoIt元素的正则表达式
非连接器=“(?:”+字符串+“|”+宏+“|”+变量+”)
capturingNonConcatenator=“(“+string+”|“+macro+”|“+variable+”)”
zeroOrMoreConcatenatedNonConcatenators=“(?:“+连接器+非连接器+”)”+“*”
#组合搜索正则表达式及其编译形式
search=string+zero或more连接的非连接器
searchRe=re.compile(search)#compile让我们为搜索指定一个开始索引
#就地处理文件
count=0#用于正确编号AutoIt字符串文字实例
对于fileinput.input(文件名,inplace=True)中的行:
换行符=“”
#将旧行转换为新行
indexInLine=0
matchOfSearchRe=searchRe.search(行,索引行)
虽然MatchOfSearcher不是无:
matchReplacement=“”
#用数字替换匹配子字符串中的每个AutoIt字符串
#并用逗号替换每个连接符
elementsOfMatch=re.split(capturingNonConcatenator,匹配搜索组(0))
对于匹配元素中的元素:
如果重新匹配(字符串、元素):
计数+=1
matchReplacement+=str(计数)
elif重新匹配(串联器,元素):
matchReplacement+=用于连接器的替换
其他:
匹配替换+=元素
#将修改后的匹配内容放入替换函数调用中
matchReplacement=replacementFunctionName+“(“+matchReplacement+”)
#在匹配之前追加最近跳过的区域并替换匹配
换行符+=行[indexInLine:matchOfSearchRe.start()]
换行符+=匹配替换
#更新循环控制变量
indexInLine=matchOfSearchRe.end()
matchOfSearchRe=searchRe.search(行,索引行)
#在最后一场比赛后追加行的其余部分
换行符+=行[indexInLine:]
#用新行替换文件名中的旧行
打印(newLine.rstrip())
在粗略测试中,此脚本转换为

;This is autoit
$string1 = "This is a test string" & @crlf & "Wow, autoit syntax!"
$string2 = "This string has a var. Var1=" & $var1
$wow = random_function("Another string") & "this is getting complex"
magic_function("var1=" & $var1 & @crlf & "other var=" & $var2)
$multivar = "This string has 2 vars: var1=" & $var1 & " var2=" & $var2

如果可能的语法情况比示例中的情况更为多样,则此脚本不能保证工作。但是,只需添加或更改“用于标识原始AutoIt元素的正则表达式”和关联的“用于标识复合AutoIt元素的正则表达式”,即可对其进行修改以满足您的需要。“任何修改都将收集在
搜索
变量中,这样就不需要在脚本主体中更改任何其他内容


注意,我在测试用例中修改了您的示例输入。您的示例的最后一行似乎有两个语法错误:缺少的
&
和额外的

无法单独使用正则表达式来完成。但是,可以使用正则表达式+状态解析来完成

根据您的示例中可能出现的语法情况,我编写了一个脚本来完成这项工作。我用Python编写它,因为我对该语言比PHP更熟悉,但是如果您无法使用Python来完成此任务,那么代码+注释应该足够清晰,以便有人将其转换为PHP

!/usr/bin/env python
导入文件输入
进口稀土
#可能要修改的值
filename=“test.au3”
replacementFunctionName=“获取字符串”
replacementForConcatenator=“,”
#用于标识原始AutoIt元素的正则表达式
string=r”“(?:“(?:[^”]|“(?=”))*”(?:[^']|“(?=”)*”)““#三个引号就是Python
macro=r“@\w+”#前缀r使\a成为文字(在字符串中,而不是正则表达式中)
变量=r“\$\w+”
串联器=r“\s*&\s*”
#用于标识复合AutoIt元素的正则表达式
非连接器=“(?:”+字符串+“|”+宏+“|”+变量+”)
capturingNonConcatenator=“(“+string+”|“+macro+”|“+variable+”)”
zeroOrMoreConcatenatedNonConcatenators=“(?:“+连接器+非连接器+”)”+“*”
#组合搜索正则表达式及其编译形式
search=string+zero或more连接的非连接器
searchRe=re.compile(search)#compile让我们为搜索指定一个开始索引
#就地处理文件
count=0#用于正确编号AutoIt字符串文字实例
对于fileinput.input(文件名,inplace=True)中的行:
换行符=“”
#将旧行转换为新行
indexInLine=0
matchOfSearchRe=searchRe.search(行,索引行)
虽然MatchOfSearcher不是无:
matchReplacement=“”
#用数字替换匹配子字符串中的每个AutoIt字符串
#并用逗号替换每个连接符
elementsOfMatch=re.split(capturingNonConcatenator,匹配搜索组(0))
对于MATC元素中的元素
;This is autoit
$string1 = "This is a test string" & @crlf & "Wow, autoit syntax!"
$string2 = "This string has a var. Var1=" & $var1
$wow = random_function("Another string") & "this is getting complex"
magic_function("var1=" & $var1 & @crlf & "other var=" & $var2)
$multivar = "This string has 2 vars: var1=" & $var1 & " var2=" & $var2
;This is autoit
$string1 = get_string(1,@crlf,2)
$string2 = get_string(3,$var1)
$wow = random_function(get_string(4)) & get_string(5)
magic_function(get_string(6,$var1,@crlf,7,$var2))
$multivar = get_string(8,$var1,9,$var2)