2011-12-05 7 views
1

内ではない場合にのみ、文字列は次のようになります。だから私は何か他のものとabcを交換したい検索し、文字列内の文字列を置換が、それは引用符

abc def 
    123 'abc' abc "def" 
    bla bla 

が、内だABCに影響を与えないように引用符。 defと同じですが、二重引用符を使用しています...

これは実際にはSQLクエリを含む文字列のため、同じ単語を含む可能性のあるフィールドの誤ったデータに置き換えずにテーブル名を置き換えます。

否定後読みと先読みは十分です
+0

「abc」のみか、「Foo abc Bar」でもかまいませんか? – stema

+0

エスケープされた見積もりはどうですか? \ "\ '? – FailedDev

+0

' 'abc''(二重引用符と一重引用符)はどうですか? – Toto

答えて

2

ネガティブルックアヘッドとネガティブヒアビハインドの正規表現を使用できます。あなたはここでその詳細を読むことができます:http://www.regular-expressions.info/lookaround.html

ここでABCと一致した例である:

(?<!['"])(?<target>abc)(?!['"]) - これは、単一または二重引用符で囲まれていない任意のABCと一致します。

2

(?<!')abc(?!') 

ABCが続いていないされていることを保証するために、ABCは、単一引用符(?<!')だけでなく、否定先読みが付いていないことを確認するために、負の後読みがあります一重引用(?!')

明らかに、これは二重引用符のための単一を切り替えることが自明変更可能です:

(?<!")def(?!") 
1

表名は、特定のキーワードの後に​​表示されます。

FROM tablename 
JOIN tablename 
INNER JOIN tablename 
LEFT JOIN tablename 
... 

私はこの事実に基づいて、交換用のパターンを構築します。

+0

*データベース名やスキーマ名が指定されていてもいなくてもかまいません。または、バッククォートで囲まれたテーブル名、または角カッコです。またはSELECT文、関数呼び出し、論理の場合、ON結合述語、WHERE節、または他の論理演算の過多の中に存在します。他にもたくさんの場所。 – MatBailie

1

は、あなたが使用することができますregexp 1このような:。

// $ new_string =にpreg_replace( "/ \"()\ "| \ '()\' /"、 "テスト" 、$ string);

1

使用しているSQLのバージョンは?いくつかのバージョンのSQL(ほとんど?)は正規表現をサポートしていません。


私の知る主なアプローチ(例えばでは、MS SQL Serverが)あなたが興味を持っている状況をチェックし、実際に文字列全体を解析関数を記述することであり、以下のように置き換えると、必要。

これはマルチステートメント機能であるため、独自のオーバーヘッドがあります。これはワンオフのように聞こえるので、それはあまりにも悪くはありません。


最高の低レベルの言語では避けるが、より高いレベルの言語で、おそらく適している別のアプローチ、...

することで、交換したくないすべての回出てくる検索と置換しますそれらは保持パターンを持つ。(このパターンは、データに存在していないことがわかっている必要があります)。置換を行い、保持パターンを元の文字列に戻します。

Start = abc "abc" 'abc' 
Step1 = abc "xxx" 'abc' -- REPLACE('"abc", '"xxx"', start) 
Step2 = abc "xxx" 'xxx' -- REPLACE('''abc''', '''xxx''', step1) 
Step3 = ??? "xxx" 'xxx' -- REPLACE('abc', '???', step2) 
Final = ??? "abc" 'abc' -- REPLACE('xxx', 'abc', step3) 
+0

実際には私はPHPではなくSQLでこれを行う必要があります:) – Alex

+0

この場合、あなたの質問にSQLタグは必要ありません:) – MatBailie