2016-04-05 16 views
1

içerebilen tek/çift tırnaklar arasında ayıklamak için kullanıyorum Bir mysql dizesinden bir dize değeri alabilen bir regex yazmaya çalışıyorum.Kaçak regex dizgisi, bir kaçış karakteri

olduğunu Yani, şu oluşturulan sql dizesi var ve FIRST_NAME ayıklamak mümkün olmasını istiyorsanız:

result = /first_name = ['"](.*?)['"]/i.match my_string 
: Ne anda sahip çoğu durum için çalışır gibi görünen

my_string = "SELECT * FROM users WHERE first_name = 'first name value'" 

Ancak mesele first_name bir 'veya "ya olduğunda, bir

result = "SELECT * FROM users WHERE first_name = 'first\"s name value'" 
or 
result = "SELECT * FROM users WHERE first_name = 'first\\'s name value'" 

t yani o sonuç döndürülen karakterin YUKARI değeridir, bu durumda, geri dönen grup "ilk" olur. Tüm ilk_adı değerinin geri gelmesi için bunu nasıl düzeltebilirim?

+0

** SQL Enjeksiyon dikkat **. –

cevap

2

Yakut 1.9+ Çözüm deneyebilirsiniz: Aynı Adlı Adlandırılan Gruplar

tek şey aynı zamanda yerini alabilir kaçış karakter gösterebilmesidir

Tek veya çift tırnak içinde dizeleri eşleştirmeniz ve sadece eşleşen tırnak işaretleri arasında eşleşmeniz gerekiyor.

aynı ada sahip birden adlandırılmış grupları kullanmak için Ruby regex özelliğini kullanın: tırnak içinde "val" grubu olur arada

/first_name = (?:'(?<val>[^'\\]*(?:\\.[^'\\]*)*)'|"(?<val>[^"\\]*(?:\\.[^"\\]*)*"))/i 

Rubular demo

değerini bakın. İşte

bir IDEONE Ruby demo geçerli:

my_string = "SELECT * FROM users WHERE first_name = 'first name value'" 
my_string2 = "SELECT * FROM users WHERE first_name = 'first\"s name value'" 
my_string3 = "SELECT * FROM users WHERE first_name = 'first\\'s name value'" 

rx = /first_name = (?:'(?<val>[^'\\]*(?:\\.[^'\\]*)*)'|"(?<val>[^"\\]*(?:\\.[^"\\]*)*"))/i 

puts rx.match my_string # => first_name = 'first name value' 
puts rx.match my_string2 # => first_name = 'first"s name value' 
puts rx.match my_string3 # => first_name = 'first\'s name value' 

(demo) "val" almak için:

rx.match(my_string)["val"] # => first name value 

Yakut 1.8 Çözüm

adlı gruplar Ruby 1.9 ve sizin beri tanıtıldı yana Ruby 1.8'de çalışması gerekiyor, negatif bir lookahead çözümü ile kısıtlanmış bir karakter sınıfı kullanın.

/first_name = (['"])((?:(?!\1)[^\\])*(?:\\.(?:(?!\1)[^\\])*)*)\1/i 

Rubular demo

(['"]) eşleşmeleri görün ve ' veya " Grup 1 içine yakalar. (?:(?!\1)[^\\])*, \ dışındaki 0+ karakterleri ([^\\] nedeniyle) ve " veya ' ((?!\1) nedeniyle) ile eşleşir. (?:\\.(?:(?!\1)[^\\])*)*) maçlar 0+ ', " veya \ dışındaki 0+ karakterlerle izlenen bir kaçış dizileri (\\. bakınız) dizileri. \1 geri tepkisi karşılık gelen kapanış teklifiyle eşleşir.

another Ruby demo bakınız:

my_string = "SELECT * FROM users WHERE first_name = 'first name value'" 
my_string2 = "SELECT * FROM users WHERE first_name = 'first\"s name value'" 
my_string3 = "SELECT * FROM users WHERE first_name = 'first\\'s name value'" 

rx = /first_name = (['"])((?:(?!\1)[^\\])*(?:\\.(?:(?!\1)[^\\])*)*)\1/i 

puts rx.match my_string  # => first_name = 'first name value' 
puts rx.match(my_string)[2] # => first name value 
puts rx.match my_string2  # => first_name = 'first"s name value' 
puts rx.match(my_string2)[2] # => first"s name value 
puts rx.match my_string3  # => first_name = 'first\'s name value' 
puts rx.match(my_string3)[2] # => first\'s name value 
+0

biliyor musunuz dönmek olmazdı. Ben denedim 2.2.2 ve her şey mükemmel çalıştı.Ancak, 1.8.7'de denediğimde, bir derleme hatası alıyorum: undefined (? ...) sequence:/first_name = (?: '(? [^' \\] * (?: \\ [^ '\\] * *).)' | "( [^?" \\] * (?:. \\ [^ "\\] *) *"))/ – Hawkeye001

+0

Hayır, adlandırılmış gruplar [Ruby 1.9'da tanıtıldı] (http://sdqali.in/blog/2013/09/29/named-capture-groups-in-regular-expressions/). "grup metni?" değilse, sadece bu adlandırılmış yakalama gruplarını kaldırın. ['/ first_n kullanın ame = (?: '[^' \\] * (?: \\. [^ '\\] *) *' | "[^" \\] * (?: \\. [^ "\\] *) * ")/I'] (http://rubular.com/r/nHV1qmEEtJ) –

+0

Tamam, Ruby 1.8 için geçici bir çözüm bulunan: ['/first_name = ([ '"]) ((:(? ! \ 1) [^ \\]) * (?: \\ (:.?! (\ 1) [^ \\]) *) *) \ 1/I'] (http://rubular.com/r/HeXjaw29dw). –

0

Bu regexp'in düzeltmek olurdu:

/first_name = ['"]((.*?)['"])*/i 

Canlı örnek here.

0

Bunu Rubular'da test ettim ve aradığınız değeri alıyor gibi görünüyor.

f_name_match = /first_name = \'(.+)\'/i.match(string).replace('\') 
0

Bu

/first_name = ['"](.*?)['"]\z/i 

örnek here

+0

kullanıcılar GELEN * Aslında bu şekilde, (i o kısmını eklemek soruyu düzenlemek olacaktır) çalıştım ama sorun bu durumda çalışacak ise sql ek parametreleri, varsa, yani sonuç = "SEÇ olmasıdır NEREDE first_name = 'ilk \ "ismini değeri' vE last_name = 'last_name'", bu (yakut eski bir sürümü üzerinde maalesef hala)? Bu Ruby 1.8 desteklenir eğer doğru – Hawkeye001

İlgili konular