Tırnakla görmezden PHP preg_replace işlevini kullanarak whitespaces değiştirin

1 Cevap php

Aşağıdaki bakalım string:

SELECT
    column1 ,
    column2, column3
FROM
    table1
WHERE
    column1 = 'text, "FROM" \'from\\\' x' AND
    column2 = "sample text 'where' \"where\\\" " AND
    ( column3 = 5 )

Ben gibi dizeden escape unnecessary white space characters gerekir:

  • beginning ve , ( ) vb ending konumdan beyaz alan kaldırma
  • satırsonunu çıkarılması (\r\n) ve sekmeler (\t)

Ama bir şey. Remove işlemi quoted string gibi gelen could not remove beyaz boşluklar:

  • 'text, "FROM" \'from\\' x'
  • "sample text 'where' \"where\\" "

vb

preg_replace($pattern, $replacement, $string);: i PHP işlevini kullanmanız gerekir

Peki $pattern değeri olacak ve $replacement burada $ dize değeri given SQL olduğunu.

1 Cevap

Tek bir regex desen ve değiştirme dize dize çalışmaz. Yorum ve dize değişmezleri maç ilk deneyin ve sonra beyaz boşluk karakterleri ve son olarak boşluk olmayan karakter maç için deneyin: İlk adım giriş dizesi tokenize için olabilir. Hızlı bir demo:

$text = <<<BLOCK
SELECT
    column1 ,
    column2, column3
FROM
    table1
-- a comment line ' " ...
WHERE
    column1 = 'text, "FROM" \\'from\\\\\\' x' AND
    column2 = "sample text 'where' \\"where\\\\\\" " AND
    ( column3 = 5 )
BLOCK;

echo $text . "\n\n";

preg_match_all('/
    --[^\r\n]*                # a comment line
    |                         # OR
    \'(?:\\\\.|[^\'\\\\])*\'  # a single quoted string
    |                         # OR
    "(?:\\\\.|[^"\\\\])*"     # a double quoted string
    |                         # OR
    `[^`]*`                   # a string surrounded by backticks
    |                         # OR
    \s+                       # one or more space chars
    |                         # OR
    \S+                       # one or more non-space chars
/x', $text, $matches);

print_r($matches);

üretir:

SELECT
    column1 ,
    column2, column3
FROM
    table1
-- a comment line ' " ...
WHERE
    column1 = 'text, "FROM" \'from\\\' x' AND
    column2 = "sample text 'where' \"where\\\" " AND
    ( column3 = 5 )

Array
(
    [0] => Array
        (
            [0] => SELECT
            [1] => 

            [2] => column1
            [3] =>  
            [4] => ,
            [5] => 

            [6] => column2,
            [7] =>  
            [8] => column3
            [9] => 

            [10] => FROM
            [11] => 

            [12] => table1
            [13] => 

            [14] => -- a comment line ' " ...
            [15] => 

            [16] => WHERE
            [17] => 

            [18] => column1
            [19] =>  
            [20] => =
            [21] =>  
            [22] => 'text, "FROM" \'from\\\' x'
            [23] =>  
            [24] => AND
            [25] => 

            [26] => column2
            [27] =>  
            [28] => =
            [29] =>  
            [30] => "sample text 'where' \"where\\\" "
            [31] =>  
            [32] => AND
            [33] => 

            [34] => (
            [35] =>  
            [36] => column3
            [37] =>  
            [38] => =
            [39] =>  
            [40] => 5
            [41] =>  
            [42] => )
        )

)

ve sonra da dizgecikli $matches dizi üzerinden yineleme ve uygun gördüğünüz uzay-maçları değiştirebilirsiniz.

Ben SQL akıcı değilim, ama benim demo üstünde kolaylıkla kırılmış olabilir oldukça eminim: Eğer benim zaten silinmiş yorumunda okudum olabilir Ama, daha iyi bir seçenek bu tokenizing gerçekleştirmek için bazı özel SQL ayrıştırıcı kullanmak olacaktır.