Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Małe zacięcie przy regexpach
Forum PHP.pl > Forum > PHP
budda1989
Witam serdecznie, opiszę ogólnie projekt który robię.
Jest to system obsługi formularzy oparty na założeniu, że wszystko da się zrobić dodając tabele do bazy, oraz includując 1 plik. Program na podstawie bazy danych, buduje formularz dodawania nowego obiektu, do dodanych tworzy liste, daje możliwość edycji. Zabezpiecza formularze zgodnie z wytycznymi z bazy danych.
Piszę to sobie, wszystko ładnie pięknie, jednak zaciąłem się przy wyrażeniach regularnych, i ich praktycznym zastosowaniu. Przeczytałem sobie cały tutorial Włodzimierza Gajdy ( ten 39 stronnicowy, dot reg expów ), jednak mimo to średnio idzie mi testowanie, i od rana próbuję rozwiązać ten problem, bezefektywnie tracąc czas, stąd moja prośba o pomoc. Na wstępie dodam, że skrypt musi być możliwie jak najbardziej wydajny. Jeżeli więc istnieją lepsze sposoby, uprzejmie proszę o ich podanie, jestem otwarty na wszelakie propozycje.

Ogólny zarys projektu mamy, teraz problemy

Chcę stworzyć funkcję, której zadaję tekst z contentem ( zmienna ), wytyczam co znajduje się bezpośrednio przed szukanąfrazą, i co znajduje się po.
Czyli np coś takiego

  1. function szukaj($text, $przed, $po)
  2. {
  3. .
  4. .
  5. .
  6. return $znaleziona_vartość
  7. }


przykłady wywołań
szukaj('<body><div id="q">1337</div></body>', '<div id="q">', '</div>'); //zwraca 1337
szukaj('<body><div id="q">int(13)</div></body>', '(', ')'); //zwraca 13

i tak dalej.
Oczywiście niektóre znaki, jak (, ', ", ), itp muszą być dodatkowo slashowane, więc pewnie jakaś tablica podmiany by musiała być

aż wstyd, ale próbowałem coś takiego.

  1. function TEXT_getValueBetween($text, $before, $after, $klasa='*')
  2. {
  3.  
  4. if($before=='(') $before='\\(';
  5. if($after==')') $after='\\)';
  6. //echo '<br />/^(.*)'.$before.'(.*)'.$after.'('.$klasa.')/<br />';
  7.  
  8. //$tmp = preg_match('/^(.*)'.$before.'(.*)'.$after.'('.$klasa.')/', $text, $ret);
  9. $tmp = preg_match('([a-z])'.$before.'[^'.$before.']([^'.$before.']'.$klasa.')'.$after, $text, $ret);
  10.  
  11. echo '<br />([a-z])'.$before.'[^'.$before.']([^'.$before.']'.$klasa.')'.$after.'<br />';
  12. print_r($ret);
  13.  
  14. return $ret;
  15. }



Jeżeli istnieje jekieś gotowe roziwązanie, jestem nim bardzo zainteresowany, szukałem po googlach i po forum, jednak musiałem źle szukać, wpisując regular expression value between, wyrażenia regularne miedzy itp itd
Uprzejmie proszę o pomoc przy rozwiązaniu problemów

aha, swoją drogą potrafię sobie poradzić z problemem od ręki

  1. $t0 = explode('(', $struct[$i]['typ']);
  2. $t1 = explode(')', $t0[1]);
  3.  
  4. $struct[$i]['typ'] = $t0[0];//nadpisuje typ na taki, bez nawiasu
  5. $struct[$i]['typMax'] = $t1[0];//wpisuje max z nawiasu


jednak nie chodzi mi o poradzenie sobie, tylko o najlepszy sposób. Jeżeli ktoś jest wstanie poradzić coś konkretnego, to bardzo bym prosił.

Pozdrawiam serdecznie
Marcin
Fifi209
substr + strpos ? Powinno wystarczyć.

Jestem jedynie ciekaw do czego Ci to potrzebne.
budda1989
no tak, ale tak ja wspomniałem z tego co wiem są to mniej wydajne punkty.
Potrzebuję to do skryptu sztucznej inteligencji, którego celem jest uczenie się rozmowy na podstawie dotąd poznanych pytań, odpowiedzi, oraz wyszukiwania jednoznacznych struktur lingwistycznych takich jak akceptacja, odmowy, rozpoznawanie emocji itp. A czy to jest istotne ? smile.gif

Temat aktualny czekam na podpowiedzi

EDIT
Nie ukrywam, iż przydałyby się jakieś wskazówki, co do porównania podobieństwa dwóch tekstów, do rozpoznawania pytań zadanych w podobny sposób.
Np zdania "Nie gram w pasjansa, ponieważ mnie nie interesuje" oraz "Pasjans mnie nie interesuje, dlatego rzadko w niego gram" są podobne, jednak takie podobieństwo trudno będzie wykryć, skrypt musiałby zbyt dużo danych posiadać. Jednak rozpoznanie zsynonimizowanych tekstów nie powinno być takie trudne, a jednak z tym też nie bardzo wiem jak ruszyć.
Sinevar
Skleciłem Ci taką funkcję. Wydaje się, że działa poprawnie.
Zważ jednak na ostatni przykład, kiedy ma wyszukiwać między 'i' a 'i' - funkcja ta zawsze bierze skrajne elementy - mam nadzieję, że o coś takiego Ci chodziło.

  1. <?php
  2.  
  3. function searchBetween($content, $start, $end, $debug = false)
  4. {
  5. // . \ + * ? [ ^ ] $ ( ) { } = ! < > | :
  6. // - which was added in php 5.3, so maybe it's wise to add it anyway as a second parameter
  7. $start = preg_quote($start, '/-');
  8. $end = preg_quote($end, '/-');
  9. $pattern = "/$start(.*)$end/";
  10.  
  11. preg_match($pattern, $content, $matches);
  12.  
  13. echo $debug ? 'pattern: ' . htmlentities($pattern) . str_repeat('&nbsp;', 10) . 'value: ' . htmlentities(@$matches[1]) . '<br/>' : '';
  14.  
  15. return $matches;
  16. }
  17.  
  18. searchBetween('<body><div id="q">int(13)</div></body>', '(', ')', true);
  19. searchBetween('<body><div id="q">int(13)</div></body>', '<div ', '</body>', true);
  20. searchBetween('<body><div id="q">int(13)</div></body>', '<body>', ')', true);
  21. searchBetween('<body><div id="q">1337</div></body>', '<div id="q">', '</div>', true);
  22. searchBetween('<body><div id="q">1337</div></body>', '1', '7', true);
  23. searchBetween('<body><div id="q">1337</div></body>', 'o', 'o', true);
  24. searchBetween('<body><div id="q">1337</div></body>', 'i', 'i', true);
budda1989
Cytat(Sinevar @ 29.04.2012, 21:07:45 ) *
Skleciłem Ci taką funkcję. Wydaje się, że działa poprawnie.
Zważ jednak na ostatni przykład, kiedy ma wyszukiwać między 'i' a 'i' - funkcja ta zawsze bierze skrajne elementy - mam nadzieję, że o coś takiego Ci chodziło.

  1. <?php
  2.  
  3. function searchBetween($content, $start, $end, $debug = false)
  4. {
  5. // . \ + * ? [ ^ ] $ ( ) { } = ! < > | :
  6. // - which was added in php 5.3, so maybe it's wise to add it anyway as a second parameter
  7. $start = preg_quote($start, '/-');
  8. $end = preg_quote($end, '/-');
  9. $pattern = "/$start(.*)$end/";
  10.  
  11. preg_match($pattern, $content, $matches);
  12.  
  13. echo $debug ? 'pattern: ' . htmlentities($pattern) . str_repeat('&nbsp;', 10) . 'value: ' . htmlentities(@$matches[1]) . '<br/>' : '';
  14.  
  15. return $matches;
  16. }
  17.  
  18. searchBetween('<body><div id="q">int(13)</div></body>', '(', ')', true);
  19. searchBetween('<body><div id="q">int(13)</div></body>', '<div ', '</body>', true);
  20. searchBetween('<body><div id="q">int(13)</div></body>', '<body>', ')', true);
  21. searchBetween('<body><div id="q">1337</div></body>', '<div id="q">', '</div>', true);
  22. searchBetween('<body><div id="q">1337</div></body>', '1', '7', true);
  23. searchBetween('<body><div id="q">1337</div></body>', 'o', 'o', true);
  24. searchBetween('<body><div id="q">1337</div></body>', 'i', 'i', true);


Jeżeli działa poprawnie, to dokładnie o to mi chodziło, zaraz się bioręza testowanie, jutro na pewno dam znać
Bardzo Ci dziękuję, jutro rzucę pomógł, jeżeli wszystko będzie ok smile.gif

EDIT 2012-04-30 10:38:00


Niestety, podobnie jak i w tym ostatnim przykładzie, nie bardzo działa to na większych plikach, jeżeli zapodam mu np tabelkę, i powiem, aby znalazł rzeczy między <tr> a </tr>, to i owszem, znajdzie, całą tabelę bez pierwszego i ostatniego tr'a
Zastanawiam się jakby to przerobić na potrzeby programu, niestety narazie zakodziłem to sobie na explodach, działa, ale warto by było wymyślić coś lepszego :/ Mimo wszystko dzięki wielkie za pomoc, może uda Ci się coś tam jeszcze wymyślić smile.gif
Dominator
Przepraszam, że się wtrącam w temat, ale robisz coś takiego ?

http://cleverbot.com/
budda1989
Cytat(Dominator @ 29.04.2012, 21:44:08 ) *
Przepraszam, że się wtrącam w temat, ale robisz coś takiego ?

http://cleverbot.com/

Haha, w efekcie dokładnie taki jest cel biggrin.gif
Ale żeby to zrobić, trzeba zebrać ogromną ilość danych, i przerobić je na wszelakie sposoby smile.gif
Nasz projekt, ma jednak trochę inny cel, tutaj automacik jest, który sobie z Tobą gada o dupie maryni, nasz będzie miał za zadanie podejmowanie próby odpowiadania na konkretne pytania.
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.