Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrazenie regularne
Forum PHP.pl > Forum > PHP
Seth
Probuje stworzyc wyrazenie ktore odpowiadalo by takiemu zapisaowi:
Kod
[:<prefix>] <command> [<param>]

i pobieralo <prefix>, <command> i <param>
To co jest w [ i ] jest opcjonalne. Spacje musza byc zachowane.

Jezeli ma ktos pomysl byl bym wdzieczny za pomoc.
Jabol
a nie łatwieł byłoby zrobić pętelke, przejechać się po tekście i wyciągnąć to ręcznie?
Seth
Cytat
a nie łatwieł byłoby zrobić pętelke, przejechać się po tekście i wyciągnąć to ręcznie ( tutaj przykład co do wysokopoziomowości winksmiley.jpg ) ?

Teraz pobieram to przez exploda ale chcial bym aby to bylo zgrabniej napisane, wiec wolal bym w regularnych.
Jabol
spróbuj tak.[php:1:2c4955e52e]<?php
$str="[:<prefix>]<commad>[<param>]";
$prefix="";
$command="";
$param="";
if($str{0} == "[" && $str{1} == ":")
{
$i=2;
while($str{$i} != "]")
$prefix.=$str{$i++};
$i++;
while($str{$i} != "[")
$command.=$str{$i++};
$i++;
while($str{$i} != "]")
$param.=$str{$i++};
}
printf( "%sn%sn%sn%sn", $str, $prefix, $command, $param );
?>[/php:1:2c4955e52e]kurcze, daje mi wynik
Cytat
[:][]
( php5beta2 )
lol - trza było wysłać header( "Content-Type: text/plain" )
Seth
Nie o to chodzi smile.gif

Ten zapis: [:<prefix>] <command> [<param>] to przenosnia tzn. prawdziwe wyrazenie moze byc takie:

:costam jakas_komenda parametry parametr2
lub
:costam jakas_komenda parametry
lub
:costam jakas_komenda
lub
jakas_komenda parametry
itd.
Jabol
Cytat
Ten zapis: [:<prefix>] <command> [<param>] to przenosnia
ups rolleyes.gif ... to się chyba nie zrozumięliśmy... 8)
aczkolwiek w takim razie też użyłbym exploda, a jeżeli już wyr. reg. to tylko jako ćwieczenie ( IMHO tutaj strata czasu i zasobów ).
FiDO
Kod
(?::(.*?) )?([^ $]+)(?: (.*))?

Takie cos Cie zadowala?
Seth
Nie dziala.

Kod, ktory testuje to wyglada tak:
[php:1:b98c948329]$test = ':host.pl 324 Test';
preg_match( "(?:[:](.*?) )?([^ $]+)(?: (.*))?", $test, $match );
print_r( $match );[/php:1:b98c948329]
FiDO
Nie zapominaj, ze wyrazenie do preg_match'a trzeba jeszcze zamknac w delimitery...

[php:1:6a09ec0507]
<?php
$test = ':host.pl 324 Test';
preg_match( "/(?::(.*?) )?([^ $]+)(?: (.*))?/", $test, $match );
print_r( $match );
?>
[/php:1:6a09ec0507]
adwol
Cytat
Probuje stworzyc wyrazenie ktore odpowiadalo by takiemu zapisaowi:
Kod
[:<prefix>] <command> [<param>]

i pobieralo <prefix>, <command> i <param>
To co jest w [ i ] jest opcjonalne. Spacje musza byc zachowane.

[php:1:b3ce5d5746]<?php
if (preg_match('/^(:([^ ]*))? ([^ ]+)( ([^ ]*))?/', $tekst, $m))
list($prefix, $command, $param) = array($m[2], $m[3], $m[5]);
?>[/php:1:b3ce5d5746]
FiDO
Jesli juz ma byc po Twojemu to tak:
Kod
/^(:([^ ]*) )?([^ ]+)( ([^ ]*))?/

Pozatym Twoja albo moja (w zaleznosci od tego co chcial dokladnie osiagnac Seth) wersja nie dziala dla przypadku z wieloma parametrami.
Twoja wersja "wylapuje" tylko pierwszy, a moja wszystkie do jednego stringa.
adwol
Cytat
Jesli juz ma byc po Twojemu to tak:
Kod
/^(:([^ ]*) )?([^ ]+)( ([^ ]*))?/

Ok, ale jeszcze znalazlem 2 nieścisłości w swojej wersji:
Kod
/^(:([^ ]+) )?([^ ]+)( ([^ ]+))?/

Teraz powinno być ok.
Seth
Wielkie dzieki panowie dziala smile.gif
FiDO
Ok, to i ja poprawilem swoja winksmiley.jpg
Kod
/^(?::([^ ]+) )?([^ ]+)(?: (.+))?/
Seth
Zmodyfikowalem troche wyrazenie, ktore podales adwol tak aby w przypadku pojawienia sie wiecej niz jednego parametru oddzielonego spacja byly dostepne jako jeden ciag:
Kod
/^(:([^ ]+) )?([^ ]+)( (.*))?/

...moze komus sie to przyda winksmiley.jpg
FiDO
No to przeciez to samo (i jeszcze wiecej winksmiley.jpg ) masz w "moim" wyrazeniu ;P
Seth
Wiem... ale w adwola tego nie bylo ;P
Jabol
Ok, korzystając z chwili wolnego czasu jeszcze raz podeszłem do sprawy - i naprawdę chcięlibyście używać do tego werażeń regularnych ? 8O [php:1:9bcac563ad]<?php
header("Content-Type: text/plain");
$cmd=":someprfx somecommand some args and some more ones VeRy BiG 4rg00m3||7sn";
$prefix="";
$command="";
$params=array();
$i=1;
$ws=0;
if($cmd{0}==':')
{
$curr=&$prefix;
while($cmd{$i}!="n")
{
$curr.=$cmd{$i++};
if($cmd{$i}==' ')
{
$i++;
if(++$ws==1)
$curr=&$command;
else
$curr=&$params[];
}
}
}
printf("prefix: %sncommand: %snparams: ", $prefix, $command);
print_r($params);
?>[/php:1:9bcac563ad]
KaMeLeOn
Cytat
Ok, korzystając z chwili wolnego czasu jeszcze raz podeszłem do sprawy - i naprawdę chcięlibyście używać do tego werażeń regularnych ? 8O [php:1:9eb83bf300]<?php
header("Content-Type: text/plain");
$cmd=":someprfx somecommand some args and some more ones VeRy BiG 4rg00m3||7sn";
// ...
?>[/php:1:9eb83bf300]

Nie ma to jak wydajny kod :wink:
Perl'owe wyrażenia są naprawdę szybkie.
Seth
Ehhh... potrzebuje kolejnego wyrazenia:
<nazwa>.plugin.php
<nazwa> - pierwsza litera: [a-zA-Z] kolejne [a-zA-Z0-9_]
<nazwa> ma byc nazwa klasy, wiec i takie znaki jakie w nazwie klasy sa dostepne.

BTW: Moze ktos zna jakis dobry kurs wyrazn regularnych... szukalem w netcie ale jak dla mnie jest to napisane zbyt pobieznie :/

Jabol: IMHO Lepiej miec 3 linie kodu z wyrazeniem, niz tak jak Ty proponowales gdzie mozliwosc pomylki w kodzie jest wieksza.
FiDO
Cytat
BTW: Moze ktos zna jakis dobry kurs wyrazn regularnych... szukalem w netcie ale jak dla mnie jest to napisane zbyt pobieznie :/

Szczerze? W manualu do php jest wszystko IMHO dosc jasno wytlumaczone.

Podaj jakis przyklad do tego co chcesz osiagnac, bo do konca nie wiem o co Ci chodzi winksmiley.jpg
Seth
Cytat
Cytat
BTW: Moze ktos zna jakis dobry kurs wyrazn regularnych... szukalem w netcie ale jak dla mnie jest to napisane zbyt pobieznie :/

Szczerze? W manualu do php jest wszystko IMHO dosc jasno wytlumaczone.

OK. Zobacze jeszcze tam smile.gif

Cytat
Podaj jakis przyklad do tego co chcesz osiagnac, bo do konca nie wiem o co Ci chodzi winksmiley.jpg

Nazwa pliku musi miec nazwe klasy <nazwa> oraz .plugin.php
Z tym, ze teraz trzeba zaznaczyc, ze nazwa musi byc zgodna z ta jaka jest akceptowalna przez parser php czyli na poczatku musi byc literaz od A do Z lub od a do z, dalsza nazwa moze sie skladac z takich znakow: A-Z, a-z lub/i 0-9 oraz z _ (podkreslenie).
I teraz wlasnie musze przelistowac pliki i sprawdzic czy nazwa pliku spelnia kryteraia czyli: nazwa pliku jest w postaci <nazwa klasy>.plugin.php oraz czy <nazwa klasy> spelnia "nazewnictwo" klas.
Jeszcze dodam, ze chcial bym aby preg_match zwrocilo mi ta nazwe klasy.

Przyklad:
klasa.plugin.php
klasa_.plugin.php
Kla34_ds.plugin.php

ale np takie nie moga wejsc:
2klasa.plugin.php
_klasa.plugin.php
df df df.plugin.php <--- (spacje)
klasa.php
klasaplugin.php
itd.
Jabol
Cytat
BTW: Moze ktos zna jakis dobry kurs wyrazn regularnych... szukalem w netcie ale jak dla mnie jest to napisane zbyt pobieznie :/
man 7 regex ( na necie są strony z manualami online, więc nie musisz mieć Uniksa
Cytat
Jabol: IMHO Lepiej miec 3 linie kodu z wyrazeniem, niz tak jak Ty proponowales gdzie mozliwosc pomylki w kodzie jest wieksza.
zawsze można napisać do tego funkcje, ale ok, to już kwestia gustu.
Seth
Wykombinowalem takie cos:
Kod
/^([A-Za-z]{1}[A-Za-z0-9_]+).plugin.php?/

...wyglada na to, ze dziala prawidlowo tylko czy taki zpis jest poprawny ?
FiDO
Kod
/^([A-Za-z][A-Za-z0-9_]*).plugin.php$/
Seth
Bylem blisko winksmiley.jpg Dzieki
PMadej
Cytat
BTW: Moze ktos zna jakis dobry kurs wyrazn regularnych... szukalem w netcie ale jak dla mnie jest to napisane zbyt pobieznie :/


Ostatnio DeyV polecił mi edytor Komodo firmy ActiveState.
Zawiera on w sobie programik pomagający tworzyć wyrazenia regularne, bardzo prosty i pomocny w nauce a do tego jeszcze obszerny tutorial tworzenia regexpow. polecam go wszystkim ktorzy maja problemy z tym.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.