Mar 16 2005
Wyrażenia regularne
Filed under PHP by Łukasz Dywicki
Od niechcenia spojrzałem dzisiaj na forum. I co widzę? Temat (php) Problem – regexy. Jako, że mam jako-takie pojęcie na temat regexpów to zobaczyłem o co chodzi. Okazało się, że to nic wielkiego, problem ze zmianą [[link]] na wersję zdatną do klikania. Jedynym problemem było to, że drugi parametr jest opcjonalny. Zacząłem myśleć, już po chwili miałem gotowy wzór, który pasował do [[link]] oraz [[link|opis]]. Zastanawiało mnie jedno – czy da się wykorzystać w preg_replace; ten wzór.. Niestety nie udało mi się do tego dojść mimo lektury bardzo dobrego poradnika na temat wyrażeń. Udało mi się w końcu zrodzić drugi wzór, znacznie bardziej skomplikowany, na zasadzie pod-wyrażeń warunkowych.
<?php // tekst do przerobki $text = '[[link|tata]]'; // wersja z podwyrazeniami (niezaimpletowana w funkcji) $regexp = '/(?(?=[[(?:.+)|(?:.+)]])[[(.+)|(.+)]]|[[(.+)]])/'; // wersja alternatywna;) $regexp = '/[[(.+?)(?:|(.+))?]]/'; $tex2 = preg_replace_callback($regexp,'wiki_link',$text); function wiki_link($mat) { if (sizeof($mat) == 3) { // jest drugi parametr - [link|opis] return '<a href="'. $mat[1] .'" title="'. $mat[0] .'">'. $mat[2] .'</a>'; } return '<a href="'. $mat[1] .'" title="'. $mat[0] .'">'. $mat[1] .'</a>'; } ?>