Php REGEX操作字符串中的变量赋值

Php REGEX操作字符串中的变量赋值,php,regex,preg-replace,Php,Regex,Preg Replace,我的PHP脚本需要一个正则表达式,它可以帮助我使用preg\u replace操作一些字符串 例如,假设我有以下字符串: myvar = first_value AND var2 = second_value 我想将其转换为: myvar = 'first_value' AND var2 = 'second_value' 但是,我也希望在值周围已经有一个引号时忽略它。因此myvar=first\u value和var2='second\u value'将变成myvar='first\u va

我的PHP脚本需要一个正则表达式,它可以帮助我使用
preg\u replace
操作一些字符串

例如,假设我有以下字符串:

myvar = first_value AND var2 = second_value
我想将其转换为:

myvar = 'first_value' AND var2 = 'second_value'
但是,我也希望在值周围已经有一个引号时忽略它。因此
myvar=first\u value和var2='second\u value'
将变成
myvar='first\u value'和var2='second\u value'
,而不是
myvar='first\u value'和var2='second\u value'

我还希望它能够处理子字符串中的空格,因为值周围已经有一个引号。因此
myvar=first\u value和var2='second value'
将变成
myvar='first\u value'和var2='second value'
,而不是
myvar='first\u value'和var2='second'value'

注意:字符串在任何时候都不会包含带有空格的无引号字符串值的变量赋值,即
myvar=first value
是一种永远不会出现的情况。但是,字符串可以包含任何其他字符,即使是特殊字符,例如
myvar=&%$@\u imspecial.*
也是完全有效的

我使用的PHP代码如下所示(#DontLaugh):

$col\u子句\u str=“myvar=first\u值,var2=second\u值”;

$replace\u pattern\u str='/([\w\@\-]+)\s*(\=\\>\\>\=\=\\您可以替换此正则表达式:-

"/(?<==\s)(\w+)/i"
"/(?<==\s)([^\s']+)/i"

更新:-

好的,对于更新的问题,您可以使用以下正则表达式:-

"/(?<==\s)(\w+)/i"
"/(?<==\s)([^\s']+)/i"

“/(?您可以替换此正则表达式:-

"/(?<==\s)(\w+)/i"
"/(?<==\s)([^\s']+)/i"

更新:-

好的,对于更新的问题,您可以使用以下正则表达式:-

"/(?<==\s)(\w+)/i"
"/(?<==\s)([^\s']+)/i"

“/(?我不熟悉PHP及其正则表达式功能,但这段Python代码可能对您有所帮助:

In [1]: import re

In [2]: str1 = "myvar = first_value AND var2 = second_value"

In [3]: str2 = "myvar = first_value AND var2 = 'second_value'"

In [4]: str3 = "myvar = 'first value' AND var2 = second_value"

In [5]: regex = r"""
 .....:     (?P<variable_name>
 .....:         \w+
 .....:         \s*
 .....:         =
 .....:         \s*
 .....:     )
 .....:     (?<! ' )     # negative look-behind assertion
 .....:     (?P<value>
 .....:         \w+
 .....:     )
 .....:     (?! ' )      # negative look-ahead assertion
 .....:     """

In [6]: replacement = "\g<variable_name>'\g<value>'"

In [7]: re.sub(regex, replacement, str1, flags=re.X)
Out[7]: "myvar = 'first_value' AND var2 = 'second_value'"

In [8]: re.sub(regex, replacement, str2, flags=re.X)
Out[8]: "myvar = 'first_value' AND var2 = 'second_value'"

In [9]: re.sub(regex, replacement, str3, flags=re.X)
Out[9]: "myvar = 'first value' AND var2 = 'second_value'"
[1]中的
:导入re
在[2]中:str1=“myvar=第一个值,var2=第二个值”
在[3]中:str2=“myvar=first_值,var2=‘second_值’”
在[4]中:str3=“myvar=‘第一个值’和var2=第二个值”
在[5]中:regex=r“”
…:(?P
..:\w+
..:\s*
.....:         =
..:\s*
.....:     )
…:(?'\g''
In[7]:re.sub(regex,replacement,str1,flags=re.X)
Out[7]:“myvar=‘第一个值’和var2=‘第二个值’”
在[8]中:re.sub(regex,replacement,str2,flags=re.X)
Out[8]:“myvar=‘第一个值’和var2=‘第二个值’”
In[9]:re.sub(regex,replacement,str3,flags=re.X)
Out[9]:“myvar=‘第一个值’和var2=‘第二个值’”

您可能需要调整
\w+
以适应变量名中可能出现的所有字符。这里的想法是使用负向后看和向前看断言来检查变量值是否已经被引号括起来。

我不熟悉PHP及其正则表达式功能,但可能这是Python code对您有所帮助:

In [1]: import re

In [2]: str1 = "myvar = first_value AND var2 = second_value"

In [3]: str2 = "myvar = first_value AND var2 = 'second_value'"

In [4]: str3 = "myvar = 'first value' AND var2 = second_value"

In [5]: regex = r"""
 .....:     (?P<variable_name>
 .....:         \w+
 .....:         \s*
 .....:         =
 .....:         \s*
 .....:     )
 .....:     (?<! ' )     # negative look-behind assertion
 .....:     (?P<value>
 .....:         \w+
 .....:     )
 .....:     (?! ' )      # negative look-ahead assertion
 .....:     """

In [6]: replacement = "\g<variable_name>'\g<value>'"

In [7]: re.sub(regex, replacement, str1, flags=re.X)
Out[7]: "myvar = 'first_value' AND var2 = 'second_value'"

In [8]: re.sub(regex, replacement, str2, flags=re.X)
Out[8]: "myvar = 'first_value' AND var2 = 'second_value'"

In [9]: re.sub(regex, replacement, str3, flags=re.X)
Out[9]: "myvar = 'first value' AND var2 = 'second_value'"
[1]中的
:导入re
在[2]中:str1=“myvar=第一个值,var2=第二个值”
在[3]中:str2=“myvar=first_值,var2=‘second_值’”
在[4]中:str3=“myvar=‘第一个值’和var2=第二个值”
在[5]中:regex=r“”
…:(?P
..:\w+
..:\s*
.....:         =
..:\s*
.....:     )
…:(?'\g''
In[7]:re.sub(regex,replacement,str1,flags=re.X)
Out[7]:“myvar=‘第一个值’和var2=‘第二个值’”
在[8]中:re.sub(regex,replacement,str2,flags=re.X)
Out[8]:“myvar=‘第一个值’和var2=‘第二个值’”
In[9]:re.sub(regex,replacement,str3,flags=re.X)
Out[9]:“myvar=‘第一个值’和var2=‘第二个值’”

您可能需要调整
\w+
以适应变量名中可能出现的所有字符。这里的想法是使用负向后看和向前看断言来检查变量值是否已经被引号包围。

“这就是字符串的问题,”他说,“你不会相信你能包含在它们里面的所有东西;不仅仅是字母,还有特殊符号,比如({}!=,等等!”
“这就是字符串,”他说,“你不会相信你能包含在它们里面的所有东西;不仅仅是字母,还有特殊符号,比如({}!=,等等!”
@mellamokb我想他只是想。”stringize“变量赋值。这非常有效。@Chuck..好的,我更新了答案。检查它是否涵盖了您的所有可能性。@Rohit不,它不起作用。以下是我所做的,您可以自己尝试:
$col\u clause\u str=“myvar=first\u value和var2=second\u value”;$replace\u pattern\u str=/(?好的,你得到了什么?你期望得到什么?我已经尝试过了,它在Java中工作。它当然应该与
preg_replace
@Rohit一起工作。好的,我没有使用Java…我使用的是PHP,正如我的问题所描述的那样。@mellamokb我想他只想“字符串化”“变量赋值。效果很好。@Chuck..好的,我更新了答案。检查它是否涵盖了你的所有可能性。@Rohit不,它不起作用。以下是我所做的,你可以自己尝试:
$col\u clause\u str=“myvar=first\u value和var2=second\u value”;$replace\u pattern\u str=”/(?好的,你得到了什么?你期望得到什么?我已经尝试过了,它在Java中工作。它当然应该与
preg_replace
@Rohit一起工作。好吧,我没有使用Java…我使用的是PHP,正如我的问题所描述的那样。