Temat: PHP i Ciągi

Witam Bracia Atarowcy:)

Prosze Was o pomoc, bo siedze juz caly dzien i nie moge sobie z tym poradzic:) (szukalem na googlu ale nie znalazlem tego co chcialem)

mam taki ciag: "jakis text [znacznik]tu informacja ktora chce wyciac[/znacznik] i dalej jakis text

teraz moje pytanie jak z takiego ciagu za pomoca wyrazen regularnych (tak chce przy pomocy wyrazen regularnych) wyciac z tego ciagu to co jest miedzy [znacznik] a [/znacznik] i przeniesc wyciety fragment do nowego ciagu.:)

za pomoc moge zaoferowac 4xpack piwka lub odwdzieczyc sie w inny sposob;)

pozdrawiam i czekam na info..

ps. zalezy mi na czasie

My tu gadu gadu, a dziewczyny w Ornecie nic cieplego w ustach od rana nie mialy:) <>

2

Odp: PHP i Ciągi

Jak Ci zalezy na czasie to zrob bez regularnych... :)

$string="jakis text [znacznik]tu informacja ktora chce wyciac[/znacznik] i dalej jakis text";
$q1=explode("[znacznik]",$string);
$q2=explode("[/znacznik]",$q1[1]);
$twoj_tekst=$q2[0];
echo $twoj_tekst;

3

Odp: PHP i Ciągi

dzieki lewiS :) Ale i tak prosba aktualna czy dasz rade to opisac na regularnych;)

juz masz 1/2 zgrzeweczki;)

My tu gadu gadu, a dziewczyny w Ornecie nic cieplego w ustach od rana nie mialy:) <>

4

Odp: PHP i Ciągi

Czy pytanie jest podchwytliwe, czy wystarczy coś takiego?

$string="jakis text [znacznik]tu informacja ktora chce wyciac[/znacznik] i dalej jakis text";

preg_match('@\[znacznik\]([^]]*)\[/znacznik\]@', $string, $match);
$twoj_tekst=$match[1];
echo $twoj_tekst;

jeżeli znacznik może być czymś innym niż te brzydkie [znacznik] i [/znacznik] to RE może być o wiele prostrze. np dla  ~%~ mamy:

preg_match('/~%~(.*?)~%~/', $string, $match);

(wywal znak zapytania jeśli ma brać najdłuższy ciąg pomiędzy dwoma ~%~ (teraz bierze najkrótszy))

5

Odp: PHP i Ciągi

He jak zobaczylem topic, wiedzialem ze my best World Master of Preg wpadnie =p

btw przydatny jest tez preg_split, jezeli chcemy pociac text wg. jakiegos znacznika:

  $tab = preg_split( "/\[znacznik\]/", $string );
   var_dump( $tab ); -> dostaniemy tablice z ciagami, podzielona "wg. znacznikow".

Ostatnio edytowany przez solo/ng (2006-08-15 21:41:26)

6

Odp: PHP i Ciągi

dzieki chlopaki:) wiedzialem ze na brac Atarowska mozna zawsze liczyc:)

Kurcze  z tego wynika ze kazdy z Was ma czteropacka:)

Ustalamy taka wersje: kto bedzie na jakims sztabie dostaje 4x Piwko lub na jakims zlocie kupuje 24xPiwko i pijemy razem:)

Laoo -> masz jakiegos moze tutka na ten temat? moze byc INGLISZ lub POLISZ:)

dzieki jeszcze raz

My tu gadu gadu, a dziewczyny w Ornecie nic cieplego w ustach od rana nie mialy:) <>

7

Odp: PHP i Ciągi

Chciałem zauważyć, że przykład Laoo wyłoży się na poniższym:

tekst [znacznik]kolejny ] za nawiasem[/znacznik] reszta

Zakładając, że w łańcuchu będzie tylko jeden znacznik otwierający i odpowiednio do niego jeden zamykający wystarczy takie coś:

$text = 'to jest [znacznik]tek[/znacznik]s[znacznik]t[/znacznik] testowy.';
$cut = ereg_replace( '[^[]*\[znacznik](.+)\[/znacznik].*', '\1', $text );

funkcje ereg_* są szybsze od preg_*.

Ostatnio edytowany przez Lizard (2006-08-16 01:00:09)

Zawsze mam rację, tylko nikt mnie nie słucha.

8

Odp: PHP i Ciągi

Jeśli znaczniki mogą być różne i zagnieżdżone, to wyrażenia regularne się do tego nie nadają i potrzebny jest parser. Standardem przemysłowym tekstu ze znacznikami od X lat jest XML, czyli <znacznik> a nie [znacznik]. Element <znacznik> można pobrać następującym wyrażeniem XPath:

znacznik

a sporo tzw. przetwarzania tekstu wykonuje się przy pomocy XSLT.

Ale to offtopic, bo w pehapie podobno nie ma nawet Unicode. :P

https://www.youtube.com/watch?v=jofNR_WkoCE

9

Odp: PHP i Ciągi

jest też taka fajna klasa w php htmlsql.class.
działa tak piknie, że podajesz np. select * from body :)
albo select value from zmienna where hidden = 1 :)

Cuda wianki i nie tylko :) POKEY 4ever ;)

10

Odp: PHP i Ciągi

Mały:

Helion wydał książeczkę Jeffrey E. F. Friedl "Wyrażenia regularne". Na emulu jest nawet drugie wydanie jako "Mastering Regular Expressions" :)

Lizard:

Zauważyłem ten błąd zanim wczoraj poszedłem spać, ale nie chciało już mi się włączać komputera ;)
Defacto te wyrażenie jeśli działało to tylko przypadkiem i zamiast ([^]]*) powinno być to co w drugim przykładzie, czyli (.*?). Znak zapytania po gwiazdce sprawia, że jest ona leniwa i zjada tak mało jak się da i zatrzyma się na pierwszym ciągu, który dopasuje się do dalszego fragmentu, dzięki czemu nie mamy ograniczenia na ilość znaczników - wyrażenie zawsze dopasuje się do pierwszej pary.
Co do przewagi szybkościowej eregów nad pregami to dokumentacja jednak mówi, że te drugie są zwykle szybsze :)

Fox:

XSLT jak najbardziej jest w php ale to oczywiście offtopic, bo wątpie żeby Mały używał zagnieżdżonych znaczników ;)

sun:

daj proszę linka do tej klasy bo tak jakoś nigdzie nie mogę jej znaleźć...

11

Odp: PHP i Ciągi

laoo: służę linkiem http://www.jonasjohn.de/lab/htmlsql.htm

używam, działa piknie.

Ostatnio edytowany przez sun (2006-08-16 12:10:40)

Cuda wianki i nie tylko :) POKEY 4ever ;)

12

Odp: PHP i Ciągi

laoo/ng napisał/a:

Defacto te wyrażenie jeśli działało to tylko przypadkiem i zamiast ([^]]*) powinno być to co w drugim przykładzie, czyli (.*?). Znak zapytania po gwiazdce sprawia, że jest ona leniwa i zjada tak mało jak się da i zatrzyma się na pierwszym ciągu, który dopasuje się do dalszego fragmentu, dzięki czemu nie mamy ograniczenia na ilość znaczników - wyrażenie zawsze dopasuje się do pierwszej pary.

Zgadza sie, tylko PHP jakoś nie lubi '?' za innymi znacznikami powielającymi. :/

laoo/ng napisał/a:

Co do przewagi szybkościowej eregów nad pregami to dokumentacja jednak mówi, że te drugie są zwykle szybsze :)

Sorry, coś mi się w takim razie poprzestawiało. :)

Zawsze mam rację, tylko nikt mnie nie słucha.

13

Odp: PHP i Ciągi

Lizard napisał/a:

Zgadza sie, tylko PHP jakoś nie lubi '?' za innymi znacznikami powielającymi. :/

Tak źle chyba nie jest. W tej dokumentacji w rozdziale Repetition piszą, że if a quantifier is followed by a question mark, then it ceases to be greedy, and instead matches the minimum number of times possible. Sprawdzałem i działa.

14

Odp: PHP i Ciągi

Jak dla mnie panowie mijają się z prawdą. Dodanie znaku zapytania do '.+' w moim przykładzie powoduje, że wyrażenia regularne stają się tak leniwe, że nic nie zwracają. A wszystko to w:

$ php --version
PHP 4.4.3 (cli) (built: Aug  5 2006 01:17:50)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
Zawsze mam rację, tylko nikt mnie nie słucha.

15

Odp: PHP i Ciągi

Tak dzieje się dlatego, że używasz wyrażeń POSIXowych (ereg i spółka), a dokumentacja tyczy się PCRE (preg_match i spółka).
Perlowe regexy są chyba poprostu lepsze ;)

16

Odp: PHP i Ciągi

Jeszcze raz dzieki:)

pozdrawiam

My tu gadu gadu, a dziewczyny w Ornecie nic cieplego w ustach od rana nie mialy:) <>

17

Odp: PHP i Ciągi

Laoo, perlowe pozwalają zapisać to samo wyrażenie krócej, ale ilość operatorów nie mieści mi się w pamięci, dlatego wolę posiksy. ;)

Zawsze mam rację, tylko nikt mnie nie słucha.

18

Odp: PHP i Ciągi

Sun swietna klasa, dzienx za linka:).

19

Odp: PHP i Ciągi

żeby nie powiedzieć, że zajebista. jaki prymityw, jak się patrzy w kod, a tyle radości.

Ostatnio edytowany przez sun (2006-08-18 17:55:13)

Cuda wianki i nie tylko :) POKEY 4ever ;)

20

Odp: PHP i Ciągi

ja tam popieram 0xf'a - regexpy nie do tego byly wymyslone (co zabawniejsze - powstaly na potrzeby edytora tekstu ;) )
ale co do piwania parsera - w php? - poroniony pomysl, chyba zeby napisac takowy w C, po czym go do php linkowac, jako zbior dodatkowych procedur...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

21

Odp: PHP i Ciągi

ale kto mówi o pisaniu parsera? Mały chciał tylko wyciąć fragment napisu, a do parsowania tekstów to temu dalego ;)

22

Odp: PHP i Ciągi

gdyby chodzilo tylko o wyciecie fragmentu napisu - to rozwiazanie proponowane przez lewiSa wydaje sie byc lepsze, choc jeszcze prostrze:

$znacznik = "znacznik";
$ciag = "jakis text [znacznik]tu informacja ktora chce wyciac[/znacznik] i dalej jakis text";
$szukany_tekst = substr($ciag, ($tmp = strpos($ciag, "[$znacznik]") + strlen($znacznik) + 2),  $tmp + strpos($ciag, "[/$znacznik]", $tmp));

albo jakos podobnie ;) (oczywiscie kod ten przymuje ze takie wyrazenie wystepuje ;)

pamietajcie ze uzywanie zwyklych strstr, strpos, substr zawsze bedzie szybsze niz uzywanie regexpow (nawet najprostrzych)

Ostatnio edytowany przez jellonek (2006-08-18 23:50:25)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep