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

You can replace this regex: -

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

with: -

'\1'

Update: -

Ok, for your updated question, you can use this regex: -

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

And replace it with same string - '\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 に答える