Autor | Zpráva | ||
---|---|---|---|
4ever Profil |
#1 · Zasláno: 19. 8. 2011, 17:47:40
Zkouším výraz, který by vytáhl názvy sloupců z řetězce např.
$columns="`cat`,`group`,`path`,`type`"; preg_match_all("@([^,\W]*)@", $columns, $matches); nebo preg_match_all("@(?<=`)([^,\W]?)(?=`)@", $columns, $matches); Bohužel se mi moc nedaří. Máte někdo lepší nápad? Nebo ještě jinak a to z řetězce v tomto tvaru, bez uvozovek $columns="cat group path type"; preg_match_all("@([\w-]*?)@U", $columns, $matches); print_r($matches); To se mi daří :-) ale problém je v tom, že se v tom poli vytvoří taky prázdné prvky. Tzn chci dostat pouze ty výsledky, které nejsou null nebo "" nebo " ". To samé o tom prvním pokusu. |
||
Tori Profil |
#2 · Zasláno: 19. 8. 2011, 17:57:06 · Upravil/a: Tori
A nestačilo by použít tohle?
$columns="`cat`,`group`,`path`,`type`"; $columns = explode(',', $columns); foreach ($columns as $name) echo "sloupec = " . trim($name, "` "); Edit: oprava, omylem jsem použila implode. |
||
4ever Profil |
#3 · Zasláno: 19. 8. 2011, 18:00:33
Tori:
Tak stačilo, ale hezčí by to bylo udělat to jedním příkazem :-) |
||
Rellik Profil |
#4 · Zasláno: 19. 8. 2011, 18:00:53
skus:
$columns="`cat`,`group`,`path`,`type`"; echo $columns."<br />\n"; preg_match_all("/`(.*)`/Us",$columns,$match, PREG_SET_ORDER); print_r($match); |
||
4ever Profil |
#5 · Zasláno: 19. 8. 2011, 18:17:20 · Upravil/a: 4ever
Tori:
Jsem to chtěl udělat tak, že jako argument funkce se může zadat buď názvy sloupců oddělené mezerama nebo oddělené čárkama. Pak provést dvě operace. 1) dostat názvy sloupců do pole 2) získat řetězec s uvozovkama pro mySQL příkaz ad 1) Když zkusím tvůj styl, tak bych to udělal takto: $columns = 'html jpg gif'; // $columns = 'html , jpg , gif'; if (strpos($columns, ",")) $matches = explode(',', $columns); else $matches = explode(' ', $columns); print_r($matches); a potom provést foreach trim + ad 2) sloučení řetězců a doplnění uvozovek. Jenže v případě, že řetězec je 'html jpg gif', pak vzniknou volná místa, tedy prvky, které nenesou řádný název sloupce. Rellik: No, ale jsou tam stále volná místa i bez PREG_SET_ORDER a navíc je to vícerozměrné pole. To potřebuju o jednorozměrného pole (to už by byla jednodušší varianta s foreach). |
||
Tori Profil |
#6 · Zasláno: 19. 8. 2011, 18:26:15
4ever:
„Jsem to chtěl udělat tak, že jako argument funkce se může zadat buď názvy sloupců oddělené mezerama nebo oddělené čárkama.“ Jo aha, já počítala s tou první variantou, teda MySQL syntaxí. Takhle to je jednodušší. „Pak provést dvě operace.“ 1. Sjednotit oddělovače (nahradit všechny mezery, čárky apod. za jednu čárku) 2. Explode podle čárky. |
||
4ever Profil |
#7 · Zasláno: 19. 8. 2011, 18:33:42 · Upravil/a: 4ever
Tori:
> „Pak provést dvě operace.“ > 1. Sjednotit oddělovače (nahradit všechny mezery, čárky apod. za jednu čárku) > 2. Explode podle čárky. to by šlo, ale kořen problému zůstává, že ve výsledku jsou prázdné prvky. Což se dá ale pomocí foreach vynechat. Kdyby někdo věděl jak upravit ty moje regulární výrazy tak, aby nevyhazovaly jednotlivé písmena, ale celá slova a aby to nevracelo prázdné výsledky, bylo by to taky fajn. |
||
4ever Profil |
#8 · Zasláno: 19. 8. 2011, 18:39:22 · Upravil/a: 4ever
Rellik:
Užití tvého příkazu jsem našel: $columns = "`".preg_replace("@[^\w-]@","`,`",$columns)."`"; // jakýkoli znak, který není slovního typu a není pomlčka nahradit $columns = preg_replace(array("@`{1,4}@", "@`,`,`@"),array("`","`,`"), $columns); preg_match_all("/`(.*)`/Us",$columns,$matches); print_r($matches[1]); Toto je funkční pro obě varianty zápisu. Akorád teda že je to na tři příkazy a ne na dva nebo jeden. Kdybychom neprovedli řádek 2. pak bychom dostali $columns např: `cat`,`diff1`,`diff2`,`depth`,`point`,`dir`,``,`file`,``,`open`,``,`sub`,``,`move`,``,`angle`,``,`desc`,``,`p2`,``,`html`,``,`jpg`,``,`gif`,``,`common_path` |
||
Tori Profil |
#9 · Zasláno: 19. 8. 2011, 19:13:28
4ever:
„kořen problému zůstává, že ve výsledku jsou prázdné prvky.“ Myslela jsem nahrazování regulárem, aby se třeba deset mezer za sebou nahradilo jednou čárkou - potom by neměly vznikat prázdné prvky pole. „navíc je to vícerozměrné pole. To potřebuju o jednorozměrného pole“ Přece není problém dál použít $matches[1], které obsahuje všechny nalezené řetězce, ne? Zkuste si třeba tohle, nevím která varianta je rychlejší, neměřila jsem. $columns = "cat`,`group-37` path `my_type`"; $out = array(); $regex = '~([a-z0-9_-]+)~i'; preg_replace_callback($regex, function ($match) use (&$out) { $out[] = $match[1]; }, $columns); var_dump($out); preg_match_all($regex, $columns, $m); var_dump($m[1]); |
||
Časová prodleva: 13 let
|
0