Autor Zpráva
Milkys
Profil
Dobrý večer vážení,
mám takový dost specifický dotaz zda je to vůbec proveditelné.
Prosím Vás zkušenější potřeboval bych rozdělit např. tento řetězec:
"Na silvestra se Neopiji, Protože budu pít málo piva, vína a rumu"
Jako "dělítko" bych potřeboval použít čárku a to jen za předpokladu, že 1. písmeno slova za čárkou je velké. V opačném případě nerozdělovat.
Nebo by jako dělítko mohlo být velké písmeno za předpokladu, že je před ním čárka. Toto už fakt nevím jestli to vůbec jde.

Takže by to mělo vypadat asi takto:
"Na silvestra se Neopiji"
"Protože budu pít málo piva, vína a rumu"

Poslední můj pokus (asi pěkná slátanina) vypadá asi takto:
$pomoc = "Na silvestra se Neopiji, Protože budu pít málo piva, vína a rumu";
        if (ucfirst("$pomoc")) {
        $help[] = explode(",", "$pomoc");
        }
Dá se to vůbec nějak udělat? Existuje na to jiná funkce?
Děkuji za reakce.
PS. Samozřejmě, že řetězec je FALSE, ale to s mým problémem nesouvisí, pokusím se opít...
Alphard
Profil
Je to dost specifické. Nabízelo by se preg_split(), můžete ho zkusit, ale to asi sežere i to velké písmeno a nezabráníte tomu :-/
Potom teda si použít reguláry k náhradě za nějaký specifický znak (nebo celou sekvenci) a podle ní pak explode(). Inspirace třeba http://cz.php.net/manual/en/function.preg-split.php#91176.
Milkys
Profil
Alphard:
To je fofr, děkuji za tipy, vyzkouším. Jen mám obavy, že jsem si ukrojil trochu více než snesu, v php jsem zelenáč, ale jdu do toho a porvu se s tím.
Díky
Milkys
Profil
Tak tohle je pro mně fakt silný kafe. Může mi někdo aspoň trochu pomoci s těma regulárama. To explode bych zvládnul. Vůbec mi nejde do hlavy jak začít.
Stano
Profil
Ja by som ti poradil aby si ten reťazec prechádzal cyklom for. Kontroluj ifom či znak nieje čiarka a ak nie tak si spájaj reťazec. ak hej tak skontroluj najbližšie písmenko či je Upper. ako čítam zistil som že som to napísal dosť zmetočne ale už som tesne pred spaním. zajtra podvečer ti to môžem spísať ak si stým dovtedy neporadíš. GN
Milkys
Profil
Stano:
Děkuji za solidaritu, hezky se vyspi Stano, pro mně je noc ještě mladá. Zkusím to nějak obejít způsoby, které již zvládám.
Milkys
Profil
Tak jsem to obešel, je to funkční a budu rád, když mi to někdo zhodnotí jestli to jde napsat jednodušeji, rád se poučím. SELECT DISTINCT i SELECT UNIQUE v tomto případě nefachčil, domnívám se, že je to tím výběrem dvou sloupců. Přehlednost kodu prosím berte s rezervou, rád bych to psal ty odskoky jak se má, ale v pspadu nevím kde to nastavit tak to dělám růčo, abych se v tom vyznal aspoň já.

$result = mysql_query("SELECT trideni.kategorie, $check_kraj.kategorie FROM trideni, $check_kraj WHERE trideni.kategorie = $check_kraj.kategorie ORDER BY trideni.kategorie")
    or die("Někde je chyba: " . mysql_error());
        while ($row = mysql_fetch_object($resultk)) {
   
         $pomoc = $row->kategorie;
        $help[] = $pomoc;
        }
            if (!empty($help)) {
            $help_pole = array_unique($help);
            }
                foreach ($help_pole as $kategorie){            
                echo $kategorie.'<br />';
                }

Právě ve sloupci pardubicky.kategorie mám uvedené ty problémové údaje s čárkou a v trideni.kategorie jsou unikátní explodované. Původně jsem nevěděl jak vypisovat ze dvou tabulek naráz. Ovšem než se nyní (jednou mě to stejně nemine) učit reguláry je pro mě jednodušší mysql, tam aspoň trochu vím co hledat.

Alphard:
Budu rád za link kde je nějaký dobrý slabikář na reguláry pro prvňáky, abych to pochopil i já.
Děkuji za případné reakce
Ugo
Profil
můžeš zkusit ještě tohle, nezkoušel sem, píšu po ránu z hlavy :)

$exploded=explode(',',$text);
$ret=array();
$i=0;
foreach($exploded as $item) {
 $item=trim($item);
 $first=substr($item,0,1);
 if($first==strtoupper($first)) {
  ++$i;
  $ret[$i]=$item;
 } else {
  if(!isset($ret[$i])) $ret[$i]="";
  $ret[$i].=", ".$item;
 }
}
//unset($exploded,$first,$item,$i)
echo "<pre>";
print_r($ret);
echo "</pre>";

Edit: oprava chyby
Edit2: další oprava chyby :)
Milkys
Profil
Ugo:
to je taky dobrý jen jsem upravil závěr kodu, protože v poli nepotřebuji samostatnou čárku a to takto:

  //$ret[$i].=", ".$ret[$i];
 }
}
//unset($exploded,$first,$item,$i)
foreach($ret as $rozdelene) {
echo $rozdelene.'<br />';
}
Věřím, že s regulárama by to bylo kratší, ale pro mé začátky je to dostačující příklad jak postupovat.
Děkuji funguje, dodám ti sebevědomí, že tvoje hlava je dobrá i po ránu.
Milkys
Profil
Ugo:
Vidím, že si to upravil, také jsem na to přišel, ale podstatně déle.

Když:
$text = "Na silvestra se Neopiji, Protože budu pít málo piva, vína a rumu, Na silvestra se Neopiji, Protože budu pít málo piva, vína a rumu, Na silvestra se Neopiji, Protože budu pít málo piva, vína a rumu";

tak to zaprvé zobrazí ", vína a rumu" jen 1x a to z poslední části a za druhé by to mělo zůstat nerozdělené, protože po čárce je malé písmeno takto:
Na silvestra se Neopiji
Protože budu pít málo piva, vína a rumu
No a takhle vlastně 3x. Nechci to tu zbytečně opakovat, kvůli nežádané četnosti kw.

Vím, že existuje strtolower, ale pokud to zakomponuju do kodu tak se to "tluče" s strtoupper.
Ugo
Profil
naja inkrementování $i bylo na špatnym místě, teď je to snad už v pořádku a jestli ne, tak se mi už tahle cesta nelíbí :D
Milkys
Profil
Ugo:
je to dobrý, děkuji. Je vidět, že už není ráno... Ta proměnná $i je vlastně číslo pole a ++ ji zvyšujeme, abychom se dostali i na další políčka. Pochopil jsem to správně?
Ugo
Profil
Přesně, když je velké písmeno tak je žádoucí založit novou položku pole, předtím se přepisovala ta stávající, v případě že není velké tak je žádoucí pracovat stále s tou jednou položkou a tak se nepřičítá ale jen zkontroluje existence kvůli notice a připíše se.
Milkys
Profil
Ugo:
Jasný, ještě jednou děkuji za osvětu.
ČEST
Ugo
Profil
ještě nějaký řešení regulárama, to se mi ale vůbec nelíbí, protože preg_split samozřejmě odstříhává řetězce stejně jako explode, takže první velké písmeno zmizí, tudíž je asi třeba je zduplikovat (první řádek) a nebo udělat řešení který neznám, případně na více řádků, tohle je hezký jak je to krátký :)

$text=preg_replace('#,\s*([A-ZĚŠČŘŽÝÁÍÉŤŇĎ])#',', $1$1',$text);
$ret=preg_split('#,\s*[A-ZĚŠČŘŽÝÁÍÉŤŇĎ]#U',$text,-1);
Milkys
Profil
Ugo:
Prý někdy je hezčí, když je to dlouhý... Víš co, mám rád, když něco napíšu, abych tomu i rozumněl. Dokážu si upravit nějaká jednoduchá pravidla v .htaccess, ale abych ho z gruntu vyflusnul nebo sestavil nějaký regulár tak jak uvádíš ty, tak tam ještě nejsem. Uvítal bych nějaký solidní zdroj z čeho by se dalo naučit základy o regulárech, Tak jako jsem se základy html učil z www.jakpsatweb.cz nebo php a mysql např. z www.linuxsoft.cz. Existuje nějaký dobrý zdroj na reguláry?
Ugo
Profil
na php.net je to celkem hezky, jinak vždy když jsem něco potřeboval tak google lecos našel, žel nevím co :-P
Milkys
Profil
Ugo:
php.net znám a google také využívám. Nejhorší je, že vím co potřebuji, ale nevím jak zadat dotaz, aby to strýček G pochopil, třeba jako tento problém, který si mi pomohl vyřešit strejda nechápal co chci - a já se mu ani nedivím.
Čest

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