Autor Zpráva
filiphk
Profil
Ahoj,

chtěl bych ošetřit formulář tak, že když někdo do něj zadá "aa", "aaa" atd. či jiné písmenko vícekrát za sebou, tak aby se to po odeslání smrsklo pouze na jedno, v tomto případě na "a". Je možné to udělat třeba přes funkci preg_replace? Pokud ano, tak jakým způsobem, prosím?
nightfish
Profil
http://diskuse.jakpsatweb.cz/index.php?action=vthread&topic=78649&foru m=9&page=-1
http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=62 832#6
filiphk
Profil
Díky za odkazy, ale to můj problém neřeší. Jedna diskuze se zabývá odstraněním zdvojených pomlček z adresy a druhá odstraněním zdvojených znaků z vložených komentářů.
filiphk
Profil
To opravdu nikdo neví jak vyřešit tento problém?
ninja
Profil
Pres regularni dotaz to bude asi dost krkolomne, takze spise normalni funkce, ktera bude prochazet jednotlive znaky stringu a kdyz soucasny bude stejny jako predchozi, tak jej vyhodit.
nightfish
Profil
druhá odstraněním zdvojených znaků
což je mimochodem přesně to, co potřebuješ... akorát stačí BetaCamův příspěvek trochu upravit - místo {4,} použiješ {2,} a místo nahrazovacího \\1\\1\\1\\1 dáš jen \\1\\1
Alphard
Profil
ví, ale vlastní aktivita ti nic neříká?
zkoušel jsi ty scripty od nightfishe?
stačí minimální úprava...
<?php
error_reporting(E_ALL);
$str = 'neeeeeeeeeee aaaaaaannnnnnnnnnoooooooo';
$out = preg_replace('/(.)\\1{2,}/', '\\1', $str);
echo $out;
?>
Radim Hejhal
Profil
Jak napsal Alphard, ale podle mého názoru to má omezenou použitelnost - třeba ze správného slova 'nejjednodušší' ti to udělá 'nejednoduší', tedy slovo označující skupinu tvorů, kteří mají jiný počet duší než jednu (lol). Takže je třeba zvážit jaké vstupní hodnoty požaduješ, abys z toho nechtěně nedělal paskvil.

A jestli si potřeboval ze vstupu získat jenom první písmeno, tak na to stačí
substr($str, 0, 1);


Btw nauč se upravovat cizí nápady na svoje potřeby, používat na upravování tak jednoduchých věcí diskuzi není časově výhodný ;o)
filiphk
Profil
nightfisch
Zkoušel jsem ten skript všemožně upravit, ale stejně pak mi to vyhledává blbosti. Myslím si, že na základě podmínky "neeeeeeeeeee aaaaaaannnnnnnnnnoooooooo" mi to těžko ošetří všechna zdvojená písmena. Dal jsem tam místo toho třeba "aabbcc" atd., avšak ani to nepomohlo. I tak ale děkuji za pomoc, každé rada je pro mne cenná.

Alphard
Mořím se tady s tím přes 3 hodiny, takže bez urážky ta poznámka o vlastní aktivitě nebyla moc na místě.
Zkoušel jsem to třeba přes ereg_replace apod. Myslím, že by se to dalo řešit přes strlen, v PHP manuálu jsem našel následující kód, který se mi snad podaří upravit:

<?php
function wordlength($txt, $limit)
{
   $words = explode(' ', $txt);

   foreach($words as $v)
   {
       if(strlen($v) > $limit)
       {
            return false;
       }
   }

   return true;
}
?>

Uses like this:
<?php

$txt = "Onelongword and some small ones";

if(!wordlength($txt, 10))
{
    die("One of the words where too long");
}

?>
Radim Hejhal
Profil
Myslím si, že na základě podmínky "neeeeeeeeeee aaaaaaannnnnnnnnnoooooooo" mi to těžko ošetří všechna zdvojená písmena.
- to není podmínka, ale jen zkušební řetězec. Podmínka je /(.)\\1{2,}/. Kód, který psal Alphard skutečně správně ošetřuje zdvojené znaky, jen si to zkus. Ale viz mojí připomínku na omezenou použitelnost.

PS. a přez tu funkci co jsi našel v manuálu to raději nezkoušej, řekl bych, že to bude řádově pomalejší (a složitější).
filiphk
Profil
Radim Hejhal
Problém může být snad jen se jménem Anna, jinak myslím, že v češtině žádné jiné jméno, které by obsahovalo dvě stejná písmena za sebou není. To vyřeším tak, že nastavím podmínku, aby "Annu" to našlo už po zadaní "Ana", takže nevadí, když se z dotazu "Anna" vytratí jedno "n".

Edit: Vím, že tu tápu asi jen já, ale prosím tě co tam teda místo toho "neeeeeeeeeee aaaaaaannnnnnnnnnoooooooo" mám dát, aby mi to ta zdvojená písmena převádělo na jedno? Ja už fakt nevím, co s tím.
Radim Hejhal
Profil
Anabela? Tedy nevím jestli to jméno v češtině existuje, ale někde jsem to slyšel :o))

Místo toho dej to jméno, které chceš upravit. Takže to vlastně klidně můžeš vynechat a ve funkci preg_replace() zadat místo $str tu proměnnou, ve které už to jméno máš.
filiphk
Profil
Radim Hejhal
Anabela není v českém kalendáři, ale i kdyby se tam psali dvě "n", tak se to dá řešit jako v případě "Anny".

Sám si to můžeš zkusit, že ti to v obou případech "Aničku" najde:
http://www.filda.cz/vyznam-jmen?hledat=dotaz&jmeno=ana
http://www.filda.cz/vyznam-jmen?hledat=dotaz&jmeno=anna
filiphk
Profil
Omlouvám se nightfishovi a Alphardovi, jsem fakt trdlo, nevím proč mě nenapadlo tam nacpat proměnnou. No jo, proč to dělat jednoduše, když to jde i složitě. Sypu si popel na hlavu.

Radim Hejhal
Vyzkouším, snad už to půjde, díky za radu.
Radim Hejhal
Profil
Jo, tu Anu jsem špatně pochopil.
Jenom by nebylo hezký, aby to po zadání anna přesměrovalo na adresu kde by byla napsaná ana, zvlášť když Ana s jedním n je také jméno.
filiphk
Profil
Tak už to funguje, tisíciré díky všem, kteří mě popostrkovali až ke zdárnému výsledku! :c)

Zde je ten "zlatý" kód:
$text = preg_replace('/(.)\\1{1,}/', '\\1', $text);


Radim Hejhal
No, v kalendáři je jen "Anna", i když člověka s úředně zapsaným "Ana" už jsem také potkal. Udělat přesměrování z "ana" na "anna" není zas takový problém, ale pak by zas nebyla možnost vyhledat jména, která "ana" obsahují, např. Bohdana, Dana, Diana, Hana atd. Takže to udělám asi tak, že v titulku bude "Anna", i když se zadá jen "ana", příp. když se zadá "anna", která bude díky ošetření znaků změněna na "ana".
nightfish
Profil
filiphk
Zde je ten "zlatý" kód:
$text = preg_replace('/(.)\\1{1,}/', '\\1', $text);

použil bych spíš
$text = preg_replace('/(.)\\1{2,}/', '\\1\\1', $text);

(protože tvá verze zbytečně nahrazuje i písmena, která jsou v textu jen "jednou po sobě" - sice je nahradí tím stejným, takže se to na výstupu neprojeví, ale může to být pomalejší)
Radim Hejhal
Profil
nightfish
Ta tvoje má ten samý neduh, jen u zdvojených písmen. Takže spíš $text = preg_replace('/(.)\\1{3,}/', '\\1\\1', $text); A mimoto zadání bylo na odstranění zdvojených znaků, takže spíš
$text = preg_replace('/(.)\\1{2,}/', '\\1', $text);


Edit Tak se omlouvám, správně to má filiphk, z neznámého důvodu to (.)\\1{2,} nebere jako znak opakující se dva a vícekrát, ale jako znak opakující se více než dvakrát. No, nechápu proč se to chová zrovna takhle, ale prostě to moje řešení zdvojené znaky v tomhle případě neodstraní.

filiphk tu Annu bych vyřešil takhle:
if (!(strtolower($text) == 'anna')) $text = preg_replace('/(.)\\1{1,}/', '\\1', $text);
filiphk
Profil
nightfish
Oki, ještě to zvážím, zda to nezměním na tu "dvojku", prozatím to nechám tak, jak to je.

Radim Hejhal
Tak už jsem to nastavil tak, že když se zadá "ana" nebo "anna", tak se v titulku objeví Anna a v adrese je "ana". Vím, že by asi šlo udělat nějakou podmínku, že když se zadá "anna", aby se na to to ořezávání znaků nevztahovalo, ale kvuli jednomu jménu asi nemá moc cenu se tím zabývat. Důležité je, že v titulku bude "Anna".
filiphk
Profil
Vyřešeno, zamykám.
Toto téma je uzamčeno. Odpověď nelze zaslat.