Starší komentáře ke článku: Perl-compatible regulární výrazy v PHP - modifikátory a líné kvantifikátory

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: dgx

Datum vložení: 22.3.2005 7:36:43

ale co nadělat, od předminule k nápravě nedošlo: http://interval.cz/clanek.asp?article=3792 Vidím, že autor regulárním výrazům rozumí, ale jejich zápis v PHP naproto nezvádá, předává čtenářům špatné návyky. Opět se dozvídáme, že zpětné reference se zapisují \\1 (pravda je, že \1). Proč tedy nepíše i znak pro nový řádek jako \\n ? [i]V uvedeném regulárním výrazu jsou obsaženy jak bílé znaky (mezera), \n, \t, tak ... [/i] To je nesmysl, v uvedeném reguálním výrazu je přímo znak ord(10) a ord(9), nikoliv '\n'. Prosím, ať si autor příště ověří pomocí funkce strlen prostou délku textu ve znacích. $re="/\n\t/x"; strlen($re) vrátí [b]5[/b], řetetec má 5 znaků a není v něm žádné zpětné lomítko ani n. Je mi sice jasné, že opět házím hrách na stěnu a cobydup přispěchá na pomoc Vilém Málek s nekonečnou diskuzí nad nesmrtelností chrousta, ale už se probůh zamyslete nad tím, že blbosti nepíši já, ale jsou obsaženy v článku. To je takový problém si otestovat třeba ten strlen() v PHP? Viz http://www.dgx.cz/trine/item/regularni-korektura-intervalu-cz

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 22.3.2005 9:59:18

Ale Davide, chr(10) (tedy nikoliv ord(10)) je přeci normální bílý znak a od nepaměti je zvykem ho zapisovat jako \n. To, že v textu by mělo být uvedeno \1 místo \\1, je samozřejmě pravda. Možná to autor používá proto, aby čtenáři nebyli zmateni z toho, že v kódu se používá \\1 (což je zcela správně), ale přináší to mnohem horší druhotné zmatení.

Avatar

Autor komentáře: Richard Palát

Datum vložení: 22.3.2005 16:13:01

no, \n je znak pro nový řádek. chr() znaku pro nový řádek může být různé na různých platformách ale \n bude vždy znak pro nový řádek.

Avatar

Autor komentáře: Miroslav Pecka

Datum vložení: 23.3.2005 9:28:07

Ad [i]Opět se dozvídáme, že zpětné reference se zapisují \\1 (pravda je, že \1). Proč tedy nepíše i znak pro nový řádek jako \\n ?[/i] Důvod proc i v textu používam \\1 ap. je ten, že v textu vysvětluji výše (v článku) uvedený kód a tak \\1 je prostou extrakcí části kódu. Dovolím si tvrdit, že kdybych při vysvětlování kódu používal \1, bylo by to matoucí více. Můžete mít samozřejmě jiný, odlišný, názor. Krom toho tento můj přístup k zapisování zpětný referencí <b>v tomto kontextu</b> je zcela konzistentní s dokumentací PHP (http://cz.php.net/manual/cs/function.preg-replace.php). Ad [i]To je nesmysl, v uvedeném reguálním výrazu je přímo znak ord(10) a ord(9), nikoliv '\n'. ...[/i] Vše podstatné již napsali Jakub Vrána a Richard Palát. Doplním snad jen, že jsem přesvědčen, že to že '\n' je míněn 1 znak je zcela zřejmé například z: [i]...odpovídají všechny znaky kromě \n...[/i] [i]...až po znak konce řádku \n ...[/i] Krom toho již tabulka v prvním díle ukazuje jak se zapisují bílé znaky (a že \n je line feed). V článku uvedený zápis se mi proto zdá nejen jako běžně zaužívaný, ale v celé sérii článků jako konzistentní.

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 22.3.2005 10:05:47

Sluší se poznamenat, že při vyhodnocování kódu s modifikátorem "e" se escapují znaky ' a ". Následující kód tedy možná trochu překvapivě vypíše \": <?php echo preg_replace('~.~e', "'\\0'", '"'); ?>.

Avatar

Autor komentáře: Já

Datum vložení: 26.3.2005 15:09:45

Tenhle dotaz přímo nesouvisí s tímto článkem, ale s PCRE obecně. Jak zapíšu negativní řetězec? Pro pochopení něco jako [^neco], ale ne s množinou znaků, ale s přesným řetězcem.

Avatar

Autor komentáře: Mintaka

Datum vložení: 27.3.2005 0:03:58

Také řeším obdobný případ. Chtěl bych určitou akci vykonat u všech tagů, kromě těch, které obsahují h1, p, head atd.. Kdybych mohl negovat urcity řetězec, a ne jen určité znaky, situaci by to hodně usnadnilo. Zatím mám pouze tohle: <[\s]*[/]{0,1}[a-gi-z]{1}.*?> což projde všechny tagy kromě těch, které začínají na h - tedy head,hr,h1,h2,h3 a pod. což je ovšem od možnosti negovat celý řetězec poněkud vzdáleno. Prošel jsem už poměrně dost manuálů, diskuzí, sborníků ukázek, ale na možnost jak to vyřešit, aniž bych tím výrazem zaplnil celou A4, jsem nepřišel. Kdo ví prosím ať poradí.

Avatar

Autor komentáře: Petr Weida

Datum vložení: 27.3.2005 17:30:09

Jednou jsem se také s něčím podobným potýkal a "vyřešil" jsem to tak, že jsem daný řetězec nahradil za nesmyslý znak, který v dokumentu nikdy nikde není.

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 29.3.2005 10:25:46

Podívejte se na negativní aserce: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference.assertions

Avatar

Autor komentáře: Ash

Datum vložení: 5.4.2005 11:24:30

Proč jsou všichni takoví strto-lovers? Funguje i něco složitějšího? Třeba <?php $str = "[2] nazdar"; $nickarr[1] = "Franta"; $nickarr[2] = "Lojza"; echo preg_replace("/\[([0-9]+)\] ?/e", "'Reakce na <a href=\"#no\\1\">"'.${nickarr[\\1]}.' #\\1</a>: '", $str); ?> ? ;->

Avatar

Autor komentáře: Ash

Datum vložení: 8.4.2005 14:31:43

Řešení: echo preg_replace("/\[([0-9]+)\] ?/e", '"Reakce na $nickarr[\\1] #\\1: "', $str); i když to určitě každému hned došlo. Škoda, že tady na Intervalu vypadá "' úplně stejně jako '".

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 8.4.2005 14:52:25

Vzhled uvozovek záleží na operačním systému, prohlížeči a znakové sadě. Cokoli z toho můžete kdykoli změnit ;-)

Avatar

Autor komentáře: Ash

Datum vložení: 16.4.2005 16:50:56

Interval.cz = optimalizováno pro... ?:-) Odinstaloval jsem Arial a je to o moc lepší >;-> Ale teď vážně, CSS Intervalu není ani moje práce, ani můj problém. Můj problém je to, co z těch CSS plyne. Tedy zhoršená čitelnost kódu. Chtěl jsem tím rýpnout do toho, kdo by mohl přidat do komentářů něco na způsob oblíbeného [code]font kde "' [i]spíš[/i] nevypadá jako '", tedy žádný Arial prosím prosím...[/code]. To jen pro vysvětlení. Žertem dodejme, že někdy i snaha něco zlepšit končí fiaskem, vizte http://interval.cz/discussion-read.asp?disc=839 např. zničený 3. komentář a vlastně celá diskuse. To zkracování dlouhých řetězců muselo dát spoustu práce :) ale možná by stačilo je jednoduše proložit pár mezerama či <br />kama. P.S. Interval.cz je fantastický server, díky za něj.

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 17.4.2005 18:03:26

Interval.cz je živý server, který se vyvíjí spolu s prostředím, ve kterém existuje. Samozřejmě, že bych mohl vzít posledních sto článků a diskusních příspěvků, aplikovat na ně tu nejlepší dostupnou technologii a zbytek vyhodit, aby nekazil něčí estetické cítění. A každý půlrok toto zopakovat. Ale nějak se mi nechce ;-)

Avatar

Autor komentáře: Ash

Datum vložení: 18.4.2005 15:23:06

Jen aby to nevypadalo, že jsem autorem myšlenky [i]"vzít posledních sto článků a diskusních příspěvků, aplikovat na ně tu nejlepší dostupnou technologii a zbytek vyhodit, aby nekazil něčí estetické cítění."[/i]. To opravdu nejsem, nevím, kde se vzala. Tak se budu těšit, že během vývoje dojde i na implementaci [code]. Starších příspěvků se to nedotkne a novější, zvlášť ty pro kodéry, budou lepší.

Avatar

Autor komentáře: maro

Datum vložení: 3.7.2005 1:56:38

Zkouším volat metodu třídy $this->mr(), ale hází to NOTICE(Undefined property: mr in ..) PŘÍKLAD: $string = preg_replace( '/^(#){7} (.+)$/em', '<h1 id=\"' . $this->mr('\\2') . '\">\\2</h1>'", $string); Místo <h1 id="nadpis">Nádpis</h1> to ale vrací: <h1 id="Nádpis">Nádpis</h1> Funguje to jen když je fce mr() definována mimo třídu.. Nevíte někdo proč? resp. kde dělám chybu?

Zpět na článek | Úvodní stránka Interval.cz