Autor | Zpráva | ||
---|---|---|---|
Tomashek Profil |
#1 · Zasláno: 14. 3. 2010, 01:33:17
Zdravím, v regulárních výrazech nejsem žádný odborník a tak se ptám, jak by šlo udělat, aby nahradil jakýkoliv text (.*) do urciteho slova?
Příklad: SELECT (.*) FROM Myslel jsem, že to funguje dobře.. problém je ale v tom, že pokud mám v tom query více FROM (spojování tabulek), vybere to veškerý text až po ten druhý FROM a tudíž mně to vyhodí chybu, protože je nesmyslný SELECT. Snad jsem to popsal dobře, děkuji za rady. |
||
mckay Profil |
#2 · Zasláno: 14. 3. 2010, 10:28:53 · Upravil/a: mckay
Tomashek:
Myslím, že dvakrát FROM by v SQL nemělo být použito bez závorky (použiješ UNION()). Potom by to mělo fungovat jako v matematice, to co použiješ na jedno FROM se ti použije jen v té závorce, kde to FROM máš :). |
||
AM Profil * |
#3 · Zasláno: 14. 3. 2010, 11:08:34
Řešení je líný kvantifikátor (.*? lokálně nebo mofifikátor /U (ungreedy) globálně pro všechny kvantifikátory ve výrazu). Ale mckay má pravdu, při spojování tabulek se nepoužívá více FROM ale JOINy :)
|
||
Tomashek Profil |
#4 · Zasláno: 14. 3. 2010, 11:47:13
Jasně je to v Joinu, ale i tak mně to hodí až k němu:
SELECT něco FROM tabulka LEFT JOIN (SELECT něco FROM tabulka2) as LJoin ...... |
||
AM_ Profil |
#5 · Zasláno: 14. 3. 2010, 17:39:32
a proč ne
SELECT něco FROM tabulka LEFT JOIN tabulka2 .... ? |
||
Tomashek Profil |
#6 · Zasláno: 14. 3. 2010, 18:06:33
Protože to je komplikovanější.
Hodím sem celý SELECT .. a řeším to kvůli toho, že jsem si vytvořil třídu na stránkování, a když mám v tom selectu 2x FROM, tak (.*) vybere všechno až po ten druhý, takže mně to vyhodí SQL chybu. SELECT gs_raids.id, gs_raids.datetime, gs_raids.name, gs_raids.organizer AS organizerId, gs_raids.level, gs_raids.people, gs_users.game_nick AS organizerNick, COALESCE(logged,0) AS logged FROM gs_raids LEFT JOIN gs_users ON gs_users.id = gs_raids.organizer LEFT JOIN (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs ON gLogs.raid=gs_raids.id WHERE gs_raids.guild = '".$gs['guild']."'" |
||
Majkl578 Profil |
#7 · Zasláno: 14. 3. 2010, 22:28:15 · Upravil/a: Majkl578
AM:
„při spojování tabulek se nepoužívá více FROM ale JOINy“ Používá se také v subselectech. [#6] Tomashek Použij třeba (.*?) jak radil AM_. Nebo: $sql = 'SELECT gs_raids.id, gs_raids.datetime, gs_raids.name, gs_raids.organizer AS organizerId, gs_raids.level, gs_raids.people, gs_users.game_nick AS organizerNick, COALESCE(logged,0) AS logged FROM gs_raids LEFT JOIN gs_users ON gs_users.id = gs_raids.organizer LEFT JOIN (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs ON gLogs.raid=gs_raids.id WHERE ...'; $sql = preg_replace('~SELECT\s+.+\s+FROM~Uis', 'SELECT * FROM', $sql); echo $sql; |
||
Tomashek Profil |
#8 · Zasláno: 15. 3. 2010, 00:18:48
Zkoušel jsem obě varianty. Jak
(.*?) '~SELECT\s+.+\s+FROM~Uis' Už to vybere od SELECTU po FROM, ale problém zůstává, že to vybere oba dva. SELECT tady něco FROM gs_raids LEFT JOIN gs_users ON gs_users.id = gs_raids.organizer LEFT JOIN (SELECT type,raid,COUNT(id) AS logged FROM gs_logs WHERE (type=1 OR type=3 OR type=5) GROUP BY raid) AS gLogs ...pokračování selectu... |
||
tiso Profil |
#9 · Zasláno: 15. 3. 2010, 00:54:56
Tomashek: tak ten regulár uprav aby nebral select... pokiaľ je pred ním zátvorka.
|
||
Časová prodleva: 3 dny
|
|||
Tomashek Profil |
#10 · Zasláno: 17. 3. 2010, 20:37:20
Hurá, po hodinách zkoušení reguláru jsem na to (asi) přišel. Výběr začíná SELECTEM čili
^SELECT.*?FROM |
||
Časová prodleva: 13 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0