* libovolný znak v PHP

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
chury721
Nováček
Nováček
Registrován: 23. pro 2010

* libovolný znak v PHP

Příspěvek od chury721 »

Zdravim. Řešim problém v php a nějak na to nemůžu vyřešit.
Jde o to že potřebuji udělat podmínku pro libovolnej znak *:

Kód: Vybrat vše

$adr = $_GET['link'];
if($adr=="menu*"){
echo "OK";}
else{
echo "KO";}
a jde mi o to, jestli existuje nějakej předpis pro libovolnej znak. Potřebuju aby mi provedl příkaz když je v adrese menu a jakýkoliv další znak(*), jinak by se nic nekonalo.
Přemejšlel jsem, dalo by se to udělat přes hromadu podmínek, cyklusů a čtení z databáze - v krajním případě.

Předem děkuji.
zombux
Odborník PCT
Odborník PCT
Uživatelský avatar
Registrován: 05. čer 2003
Bydliště: sluníčkář a havloid z pražské lumpenkavárny

Re: * libovolný znak v PHP

Příspěvek od zombux »

koukni sem, vypadá to že můžeš buď použít regexpy, nebo strpos() http://answers.yahoo.com/question/index ... 056AASpciD
ignorelist: kremrole a dezoláti
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: * libovolný znak v PHP

Příspěvek od arxeiss »

Přesně jak píše zombux, využít RegExpy neboli regulární výrazy. Je to velmi mocný nástroj, ale velmi složitý. Pro tvůj problém postačí velmi jednoduchý regulár.

Kód: Vybrat vše

$adr = $_GET['link'];
if( preg_match( '/^menu.$/', $adr) ){
echo "OK";}
else{
echo "KO";}
Teď OK vypíše v případě, že v proměnné $adr je text "menua" nebo "menuA" nebo "menu5".
Problém nastane pokud máš kódování UTF-8 a bude v něm např "menuč", ale pokud to budeš brát z adresy, tak tam háčky mít nebudeš.
Když tam bude "menuaa" tak už to neplatí, ale neplatí to ani když máš jenom "menu". Pokud chceš aby to bralo i samotné "menu", tak za tu tečku dáš ? (otazník)
Pokud se rozhodneš reguláry naučit, tak se uč Perlovské, POSIXové už jsou v novějších verzích PHP deprecitní a od 6 verze už nebudou, a např. JavaScripty podporují pouze Perlovské.

A jěště, dobrá stránka na testování regulárů je http://www.regexp.cz
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
l_iNu$
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. pro 2005

Re: * libovolný znak v PHP

Příspěvek od l_iNu$ »

arxeiss píše:Problém nastane pokud máš kódování UTF-8 a bude v něm např "menuč", ale pokud to budeš brát z adresy, tak tam háčky mít nebudeš.
To přece není pravda, proč by tím neprošlo "menuč"? Tečka zastupuje jakýkoliv znak.

Dalo by se to ještě zapsat (malinko rychlejší zbytečně nepoužívá koncovou kotvu):

Kód: Vybrat vše

if (preg_match('#^menu#'', $adr)) { // jakýkoliv řetězec začínající na menu
... // tvůj kód
ale na tohle není regexp potřeba, stačí:

Kód: Vybrat vše

if (substr($adr, 0, 4) === 'menu') {
... // tvůj kód
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: * libovolný znak v PHP

Příspěvek od arxeiss »

l_iNu$ píše:To přece není pravda, proč by tím neprošlo "menuč"? Tečka zastupuje jakýkoliv znak.
Ale je. UTF-8 totiž čž... a další znaky kóduje jako 2bajtové. Tj "c" zabere 1bajt ale "č" už 2bajty. Proto strlen("č"); vrátí 2 a ne jedničku. Toto se šetří funkcema, kde před ně dáš mb_ např mb_strlen("č","utf-8"); a musíš uvést kódování, pak to funguje správně. Ale mb_preg_match_all nefunguje.
l_iNu$ píše: Dalo by se to ještě zapsat (malinko rychlejší zbytečně nepoužívá koncovou kotvu):

Kód: Vybrat vše

if (preg_match('#^menu#'', $adr)) { // jakýkoliv řetězec začínající na menu
... // tvůj kód
Myslím, že on říkal, že tam chce pouze 1 znak, nebo takto to chápu
l_iNu$ píše: ale na tohle není regexp potřeba, stačí:

Kód: Vybrat vše

if (substr($adr, 0, 4) === 'menu') {
... // tvůj kód
viz výše, může to takto být, ale musí tam být jěště v podmínce and strlen($adr) == 5 tj

Kód: Vybrat vše

if (substr($adr, 0, 4) === 'menu' and strlen($adr)==5) {
... // zbytek
A pokud tam budou háčky čárky, musí použít mb_substr(); a mb_strlen()
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
l_iNu$
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. pro 2005

Re: * libovolný znak v PHP

Příspěvek od l_iNu$ »

arxeiss píše: Myslím, že on říkal, že tam chce pouze 1 znak, nebo takto to chápu
Aha, tak pak se dá použít tvůj regexp. Pokud tam očekává nějakej unicode znak dá se použít "u" modifikátor (PCRE umí UTF8):

Kód: Vybrat vše

if(preg_match('/^menu.$/u', $adr)) {...
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: * libovolný znak v PHP

Příspěvek od arxeiss »

l_iNu$ píše:Pokud tam očekává nějakej unicode znak dá se použít "u" modifikátor
Drsné :), díky Kde je seznam nějakých těch modifikátoru? Já našel pouze
/i - nerozlišuje velká malá písmena
/m - víceřádkový režim
/s - tečka zahrne i znak \n
/x - nějaké rozšíření, ale jaké?
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
l_iNu$
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. pro 2005

Re: * libovolný znak v PHP

Příspěvek od l_iNu$ »

arxeiss píše:
l_iNu$ píše:Pokud tam očekává nějakej unicode znak dá se použít "u" modifikátor
Drsné :), díky Kde je seznam nějakých těch modifikátoru? Já našel pouze
/i - nerozlišuje velká malá písmena
/m - víceřádkový režim
/s - tečka zahrne i znak \n
/x - nějaké rozšíření, ale jaké?
http://docs.php.net/manual/en/reference ... ifiers.php
chury721
Nováček
Nováček
Registrován: 23. pro 2010

Re: * libovolný znak v PHP

Příspěvek od chury721 »

Je super, to je přesně ono, děkuji :wink:
Odpovědět

Zpět na „Programování a web“