Rafał Wilmanowicz webCzarodziej
Temat: Pytanie o wyrażenia regularne / dyktando w php
Witajcie,robię właśnie serwis z dyktandami dla dzieci i utknąłem w sumie w dość "trywialnym" punkcie, mianowicie, jak wygenerować <select> w odpowiednich miejscach w tekście?
Wymyśliłem, że słowa w dyktandzie od strony administratora mogą być wprowadzane w postaci np.: w<u|ó|ó>r dla słowa "wór". Ogólny schemat byłby taki <znaki|do|wyboru|(...)|poprawna_odpowiedź>.
Zakładając, że będę miał w tekście X-takich wystąpień, jak powiązać wyłapane ciągi (<....>) z miejscem, w którym zostały znalezione (żeby tam wstawić rozwijaną listę)?
Krzysztof
Janda
Student, University
Of Wales
Temat: Pytanie o wyrażenia regularne / dyktando w php
http://uk3.php.net/manual/en/function.preg-replace.phpTemat: Pytanie o wyrażenia regularne / dyktando w php
Niedawno pisałem coś podobnego. Po małej przeróbce dostosowałem to do twoich potrzeb.Tu masz gotowca działającego. Dostosuj go sobie.
<?php
class dyktando{
var $tekst;
var $patt='#{(.*)}#Usmi';
function wybor(){
preg_match_all($this->patt, $this->tekst, $match);
$n = count($match[0]); // zliczanie tablicy
$k=0;
$tekst = $this->tekst;
while($k<$n){
$odpowiedzi = explode("|", $match[1][$k]);
$s_ile = count($odpowiedzi); // sprawdzamy ile jest wyborów odpowiedzi
$o=0;
$ret = "<select name='odp".$k."'>";
while($o<$s_ile){
$ret .= "<option value='".$odpowiedzi[$o]."'>".$odpowiedzi[$o]."</option>";
$o++;
}
$ret .= "</select>";
$tekst = str_replace("{".$match[1][$k]."}", $ret, $tekst);
$k++; }
return $tekst;
}
}
$sprawdz = new dyktando();
$sprawdz->tekst = "Wz{u|ó|o}r na pole kwadrat{u|ó} wynosi coś tam coś tam";
echo $sprawdz->wybor();
?>
Skrypt przeleci cały tekst i wygeneruje selecty tam gdzie trzeba.
efekt końcowy: http://frrezja.exxl.pl/dyktando.phpDawid M. edytował(a) ten post dnia 19.02.12 o godzinie 04:01
Rafał Wilmanowicz webCzarodziej
Temat: Pytanie o wyrażenia regularne / dyktando w php
Dzięki wielkie :)
Jakub
Świegot
Project Manager,
OnlineSolutions
Temat: Pytanie o wyrażenia regularne / dyktando w php
a dlaczego takie kombinowanie w pętli z str_replace? straszna strata czasu.preg_replace_callback().
<?php
$text = 'Ch<rz|sz>ąsz b<rz|ż>mi w trzcinie.';
function do_replace($o) { $r = '<select>';
foreach(explode('|', $o[1]) as $opt)
$r .= '<option value="'.$opt.'">'.$opt.'</option>';
$r .= '</select>';
return $r;
}
$text = preg_replace_callback("/\<(.*?)\>/", 'do_replace', $text);
echo $text;
?>
Chyba jest różnica w ilości kodu, oraz przejrzystości.
Programować, to jedno, ale programować optymalnie i bez zbędnego komplikowania, to drugie.Jakub Świegot edytował(a) ten post dnia 22.02.12 o godzinie 21:52
Tomasz Grzechowski mysurveylab.com
Temat: Pytanie o wyrażenia regularne / dyktando w php
Nie lepiej by aplikacja wyłapywała wszystkie literki u / ó i zamieniała je na selectbox, chyba że doda się np. wyjątki, które mają być pomijane ?Wtedy łatwiej jest wprowadzać text.
Wystarczy skopiować treść książki i już mamy dyktando.
Sebastian
Zaborowski
programista /
webmaster /
freelancer
Temat: Pytanie o wyrażenia regularne / dyktando w php
Tomasz Grzechowski:
Nie lepiej by aplikacja wyłapywała wszystkie literki u / ó i zamieniała je na selectbox, chyba że doda się np. wyjątki, które mają być pomijane ?
Wtedy łatwiej jest wprowadzać text.
Wystarczy skopiować treść książki i już mamy dyktando.
Popieram pomysł. W tym momencie pokusiłbym się nawet o zepchnięcie generowania selectów na JS i komputer kliencki :)
Przemek Czekaj Programista PHP
Temat: Pytanie o wyrażenia regularne / dyktando w php
czemu selectboxy? inputy.Temat: Pytanie o wyrażenia regularne / dyktando w php
Programowym profesorem Miodkiem to raczej nie jestem.Podałem jeden ze sposobów. Dla mnie ważne że działa, bo napisałem to dla jednorazowego użytku na własne potrzeby. Więc optymalizacja i wydajność mnie nie interesowała.
Ale fajnie ze podałeś inne rozwiązanie bo mi sie podoba :)
Znając życie pewnie znalazł by sie jeszcze ktoś to by uprościł to jeszcze bardziej.
Jakub Świegot:
a dlaczego takie kombinowanie w pętli z str_replace? straszna strata czasu.
preg_replace_callback().
<?php[/quote]> [quote]$text = 'Ch<rz|sz>ąsz b<rz|ż>mi w trzcinie.';
function do_replace($o) { $r = '<select>';
foreach(explode('|', $o[1]) as $opt)
$r .= '<option value="'.$opt.'">'.$opt.'</option>';
$r .= '</select>';
return $r;
}
$text = preg_replace_callback("/\<(.*?)\>/", 'do_replace', $text);
echo $text;
?>
Chyba jest różnica w ilości kodu, oraz przejrzystości.
Programować, to jedno, ale programować optymalnie i bez zbędnego komplikowania, to drugie.
Temat: Pytanie o wyrażenia regularne / dyktando w php
Sebastian Zaborowski:
W tym momencie pokusiłbym się nawet o zepchnięcie generowania selectów na JS i komputer kliencki :)
I wiarygodność takiego dyktanda spada do zera :)
Wystarczy edytować źródło i skopiować poprawny tekst.
Jarosław Fogt IT Specialist
Temat: Pytanie o wyrażenia regularne / dyktando w php
Jakub Świegot:masz za dobre zdanie o uczniach ;) koniecznie należy dodać "<cz|trz>cinie"
<?php[/quote]> $text = 'Ch<rz|sz>ąsz b<rz|ż>mi w trzcinie.';[quote]?>
Sebastian
Zaborowski
programista /
webmaster /
freelancer
Temat: Pytanie o wyrażenia regularne / dyktando w php
Jarosław Fogt:
Jakub Świegot:masz za dobre zdanie o uczniach ;) koniecznie należy dodać "<cz|trz>cinie"
<?php[/quote][/quote]> > $text = 'Ch<rz|sz>ąsz b<rz|ż>mi w trzcinie.';[quote][quote]?>
Nie trzeba, ponieważ:
Dawid M.:W takim razie robisz podmiankę po stronie serwera. Nie ma możliwości "wykradzenia" właściwego kodu.
Sebastian Zaborowski:W tym momencie pokusiłbym się nawet o zepchnięcie generowania selectów na JS i komputer kliencki :)
I wiarygodność takiego dyktanda spada do zera :)
Wystarczy edytować źródło i skopiować poprawny tekst.
Tomasz
Walotek
Programista
Python/PHP
Temat: Pytanie o wyrażenia regularne / dyktando w php
Przemek Czekaj:
czemu selectboxy? inputy.
Inputy odpadają, bo wtedy trzeba jeszcze zgadywać jakie ma to być słowo - np. dla "chleb" w tekście dyktanda wyjdzie "[ ]le[ ]" :)
Przemek Czekaj Programista PHP
Temat: Pytanie o wyrażenia regularne / dyktando w php
true true, ale z kontekstu można by się domyślać, takie życie, nie ma lekko.
Sebastian
Zaborowski
programista /
webmaster /
freelancer
Temat: Pytanie o wyrażenia regularne / dyktando w php
Tomasz Walotek:
Przemek Czekaj:
czemu selectboxy? inputy.
Inputy odpadają, bo wtedy trzeba jeszcze zgadywać jakie ma to być słowo - np. dla "chleb" w tekście dyktanda wyjdzie "[ ]le[ ]" :)
Nie prawda. W tekście dyktanda będzie [ch|h|le[p|b]. W takim wypadku mając "hlep" z selectami na początku i na końcu każdy się domyśli o co chodzi. Zwłaszcza, że jest jeszcze kontekst zdania.Sebastian Zaborowski edytował(a) ten post dnia 25.02.12 o godzinie 11:33
Tomasz
Walotek
Programista
Python/PHP
Temat: Pytanie o wyrażenia regularne / dyktando w php
Przemek Czekaj:
true true, ale z kontekstu można by się domyślać, takie życie, nie ma lekko.
Racja, w końcu dyktando, niech się męczą! ;)
Sebastian Zaborowski
Nie prawda. W tekście dyktanda będzie [ch|h|le[p|b]. W takim wypadku mając "hlep" z selectami na
początku i na końcu każdy się domyśli o co chodzi. Zwłaszcza, że jest jeszcze kontekst zdania.
O to mi też chodziło - selecty IMHO jak najbardziej ok, ale zwykłe, tekstowe inputy odpadają.
