2016-01-13 16 views
1

我正在開發一個PHP項目,我必須不斷地分析MySQL查詢。問題是,有時候,這個查詢有超過1000個字符,我必須手動分解它,這樣我才能讀取它。在每個大寫字詞前加上<br>

有沒有辦法在每個大寫單詞之前在此字符串中添加<br>
例如,下面的查詢:

SELECT Cid0.*, Cid1.*, CId2.*, CId3.* FROM `users_cars_brands` CId0 LEFT JOIN `cars` CId1 ON CId0.cars_id = CId1.id LEFT JOIN `cars_texts` CId2 ON CId1.id = CId2.cars_id LEFT JOIN `cars_medias` CId3 WHERE CId0.users_cars_id = 1; 

將成爲:

SELECT Cid0.*, Cid1.*, CId2.*, CId3.* 
FROM `users_cars_brands` CId0 
LEFT JOIN `cars` CId1 
ON CId0.cars_id = CId1.id 
LEFT JOIN `cars_texts` CId2 
ON CId1.id = CId2.cars_id 
LEFT JOIN `cars_medias` CId3 
WHERE CId0.users_cars_id = 1; 

我一直試圖找到一種方法,使其在正則表達式,但我不知道這是否是可能的。

+2

請分享你已經嘗試了什麼。請注意*在每個大寫字母之前*表示'JOIN'之前的換行符 - 您的預期輸出與需求不同。 –

回答

1

我發現通過JDorn創建一個非常有用的PHP類稱爲sql-formatter

下面是輸入和輸出的例子:

輸入:

SELECT count(*),`Column1`,`Testing`, `Testing Three` FROM `Table1` WHERE Column1 = 'testing' AND ((`Column2` = `Column3` OR Column4 >= NOW())) GROUP BY Column1 ORDER BY Column3 DESC LIMIT 5,10 

輸出:

enter image description here

0

您可以使用SQL打包器,例如http://www.dpriver.com/pp/sqlformat.htm

這是您的示例查詢輸出:

SELECT cid0.*, 
      cid1.*, 
      cid2.*, 
      cid3.* 
FROM  `users_cars_brands` cid0 
LEFT JOIN `cars` cid1 
ON  cid0.cars_id = cid1.id 
LEFT JOIN `cars_texts` cid2 
ON  cid1.id = cid2.cars_id 
LEFT JOIN `cars_medias` cid3 
WHERE  cid0.users_cars_id = 1; 

或者http://sqlformat.org/,這是輸出:

SELECT Cid0.*, 
     Cid1.*, 
     CId2.*, 
     CId3.* 
FROM `users_cars_brands` CId0 
LEFT JOIN `cars` CId1 ON CId0.cars_id = CId1.id 
LEFT JOIN `cars_texts` CId2 ON CId1.id = CId2.cars_id 
LEFT JOIN `cars_medias` CId3 
WHERE CId0.users_cars_id = 1; 
0

實際上,你可以找位置正則表達式,太。在這裏,不消耗字符,而是引擎查找可用於插入內容的正確位置(在您的情況下爲換行符)。下面的正則表達式採用了先行和一些替代品(可以及擴大):

<?php 
$sql = "SELECT Cid0.*, Cid1.*, CId2.*, CId3.* FROM `users_cars_brands` CId0 LEFT JOIN `cars` CId1 ON CId0.cars_id = CId1.id LEFT JOIN `cars_texts` CId2 ON CId1.id = CId2.cars_id LEFT JOIN `cars_medias` CId3 WHERE CId0.users_cars_id = 1;"; 
$regex = '~ 
     (?=(?:FROM|LEFT|ON|WHERE)) 
     # search for a place where one of the words follow immediately 
     ~x'; 
$sql = preg_replace($regex, "\n", $sql); 
echo $sql; 

/* produces: 
    SELECT Cid0.*, Cid1.*, CId2.*, CId3.* 
    FROM `users_cars_brands` CId0 
    LEFT JOIN `cars` CId1 
    ON CId0.cars_id = CId1.id 
    LEFT JOIN `cars_texts` CId2 
    ON CId1.id = CId2.cars_id 
    LEFT JOIN `cars_medias` CId3 
    WHERE CId0.users_cars_id = 1; 
*/ 

?> 
相關問題