0

我的 PHP 脚本需要一个正则表达式,它可以帮助我使用preg_replace.

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

myvar = first_value AND var2 = second_value

我想将其转换为:

myvar = 'first_value' AND var2 = 'second_value'

但是,当值周围已经有一个单引号时,我也希望它忽略。所以myvar = first_value AND var2 = 'second_value'会变成myvar = 'first_value' AND var2 = 'second_value'而不是myvar = 'first_value' AND var2 = ''second_value''

当值周围已经有一个单引号时,我还希望它处理子字符串中的空格。所以myvar = first_value AND var2 = 'second value'会变成myvar = 'first_value' AND var2 = 'second value'而不是myvar = 'first_value' AND var2 = 'second' value'

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

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

$col_clause_str = "myvar = first_value AND var2 = second_value";
$replace_pattern_str = '/([\w\@\-]+)\s*(\=|\>|\>\=|\<|\<\=)\s*\'{0,1}([\w\@\.\:\+\-\/\|\{\}\[\]\~\%\$\*\!]+)\'{0,1}/i';
$replace_str = '\1 \2 \'\3\'';
$col_clause_str = preg_replace($replace_pattern_str, $replace_str, $col_clause_str);

我该如何改进这个正则表达式?!

提前致谢。

编辑: 我将问题更新为更具描述性。

4

2 回答 2

3

您可以替换此正则表达式:-

"/(?<==\s)(\w+)/i"

和: -

'\1'

更新: -

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

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

并用相同的字符串替换它 -'\1'

于 2012-12-26T15:09:29.487 回答
0

我不熟悉 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'"

您可能必须调整\w+以适应所有字符,而不是变量名称中可能出现的字符。这里的想法是使用否定的后视和前瞻断言来检查变量值是否已经被引号包围。

于 2012-12-26T16:04:32.840 回答