Stránka 1 z 1

* libovolný znak v PHP

Napsal: čtv 23. pro 2010, 02:23
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.

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 09:22
od zombux
koukni sem, vypadá to že můžeš buď použít regexpy, nebo strpos() http://answers.yahoo.com/question/index ... 056AASpciD

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 12:51
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

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 18:44
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

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 18:55
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()

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 19:08
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)) {...

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 19:18
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é?

Re: * libovolný znak v PHP

Napsal: čtv 23. pro 2010, 19:20
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

Re: * libovolný znak v PHP

Napsal: sob 25. pro 2010, 22:06
od chury721
Je super, to je přesně ono, děkuji :wink: