Autor Zpráva
4ever
Profil
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
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
Tori:
Tak stačilo, ale hezčí by to bylo udělat to jedním příkazem :-)
Rellik
Profil
skus:

$columns="`cat`,`group`,`path`,`type`";
echo $columns."<br />\n";
preg_match_all("/`(.*)`/Us",$columns,$match, PREG_SET_ORDER);
print_r($match);
4ever
Profil
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
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
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
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
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]);
Btw ještě by to chtělo upravit, aby ten regulár rozpoznal i název tabulky. Takhle by ho určil jako název dalšího sloupce.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0