1 (edited by JuliusGr 2011-01-17 11:59:26)

Topic: preg_match again (sutrumpinimai)

Sveiki. Susidūriau su žudančia problema:
turiu stringa, kuris formuojamas taip:

[a-zA-Z] ( [a-zA-Z] )
pvz: Adresas (Miestas)

arba

[a-zA-Z] ( [a-zA-Z] )  ( [a-zA-Z] )
pvz: Adresas (Miestas) (Rajonas)

o uzduotis gauti sutrumpinta stringa:
A (M) arba A (M) (R)

Kaip sita dalykeli įgivendint?

Mano bandytas atvejis netinka, kai ateina stringas su skliausteliais:

$test3 = str_replace(" ir ", " ", $subcat5); // išmetu žodelį 'ir'
$test4 = explode(' ',$test3); //sumemtau į masyvą žodžius atskirdamas tarpu
foreach($test4 as $v){$test5.=substr($v,0,1);} // suklijuoju gautus simbolius
$spec_trump = strtoupper($test5);

Tai su tokiu kodu gaunu rezultatą:
jei yra Architektu (Vilnius) tada A(
arba
jei yra Architektu (Vilnius) (Lazdynai) tada A((
arba
jei yra Architektu (Miestas Vilnius) (Rajonas: Lazdynai) tada A (V(L

O atitinkamai rezultato reiktų: A (V); A (V) (L); A (M V) (R L)

čia gal net ne preg_matchą reiktų naudot, nebežinau

Re: preg_match again (sutrumpinimai)

Tau realiai turėtų užtekti panaudoti:
a) arba preg_replace_callback() su viską apimančiu REGEXP'u ir funkcija/kodu, kuri iš žodžio paima tik pirmą raidę;
b) arba, jeigu leidžia REGEXP galimybės gali užtekti ir preg_replace();

Bet kuriuo atveju čia reikės pastudijuoti reguliarius išsireiškimus. Jeigu jau nekils rankos to daryti, teks apsiriboti standartinėm eilučių apdorojimo funkcijom, kurias naudoji dabar, tik kodas gausis painus ir ilgas (-;

Re: preg_match again (sutrumpinimai)

Blyn, tikėjausi gatavo sprendimo :( :D

Re: preg_match again (sutrumpinimai)

O koks to gatavo sprendimo tikslas, kad kažkas nemokamai gaiš savo brangų laiką už tave? (-;

Aš ir žinok taip norėčiau, gauti daug gatavų sprendimų ... (-;

Re: preg_match again (sutrumpinimai)

Tikslu to nepavadinčiau, bet tikėjausi gatavo sprendimo :)
Jeigu būtum pajuodinęs žodį 'nemokamai', būtų natūralus klausimas "už kiek?" :D

By the way,
Ačiū už nuorodas! (Y)

Re: preg_match again (sutrumpinimai)

"už kiek" čia ne klausimas. Klausimas yra ar tu čia pats bandai mokytis programuoti, ar tau tiesiog reikia kažkokios veikiančios sistemos. Jeigu pats mokiniesi, tai realiai ir turi mokytis ir domėtis viskuo, su kuo susiduri.

Re: preg_match again (sutrumpinimai)

<?php
$strs = array(
    "Architektu (Vilnius)",
    "Architektu (Vilnius) (Lazdynai)",
    "Architektu (Miestas Vilnius) (Rajonas: Lazdynai)"
);

foreach($strs AS $string){
    $result = preg_replace("/(\w+)[:]*/e", "substr('\\1', 0, 1)", $string);
   
    echo $result . "\n\r";
}
?>

# php -f test.php
A (V)
A (V) (L)
A (M V) (R L)

Re: preg_match again (sutrumpinimai)

Ačiū! Bet, visdelto savo kodą pritaikiau labiau, tik pusė naudos, jei kodas veikia, o jo nifiga nesupranti. Savo rašytas kodas ir lieka savo rašytu kodu. :)
Išvis regular expressionas žiauriai rimtas ir galingas daiktas, bet pusžaliems hatskeriams (kaip aš) dar sunku perkąst.

Re: preg_match again (sutrumpinimai)

Savo sprendimą visuomet gali pateikti čia, forume. Manau tikrai atsiras kas jį patvarkys optimaliau, paaiškins ir dar ateičiai patarimų duos. :))

Re: preg_match again (sutrumpinimai)

Aišku, jeigu palygintumem kodus, kur viena eilute, ir kur visas griozdas - skirtumas yra, tačiau:

$specialybe = str_replace(" ir ", " ", $subcat5);                                            //is 'specialybes' ismetam ' " ir " '
$pattern = '/\(/';                                                                           //ieskom pagal paterna pirmo skliausto
$check = preg_match($pattern, $specialybe);                                                  //tikrinam, ar yra tokia specialybe
    if($check){                                                                              //jeigu yra:
        $part = preg_replace("/([\(](.*?)[\)])(.*)/e","",$specialybe);                       //nuimu visame stringe visus skliaustus
        $explode = explode(" ",$part);
        foreach($explode as $item){
        echo $firstpart = substr($item,0,1);                                                 // ir sudelioju zodzius po viena raide
    }
    $secondpart = preg_replace("/(.*?).\((.*?)\s(.*?)\).\((.*?)\)(.*)/e",                    //pirmus skliaustus pasiemu \((.*?)\s(.*?)\) 
        "'('.substr('$2',0,2).''.substr('$3',0,2).')('.substr('$4',0,1).')'", $specialybe);  //ir kitus skliaustus \((.*?)\)
    echo $secondpart;                                                                        //sukarpau ir sudelioju kaip noriu
    }else{                                                                                   //jeigu nera:
        $firstpart = preg_replace("/([\(](.*?)[\)])(.*)/e","",$specialybe);
        $explode = explode(" ",$firstpart);
            foreach($explode as $item){
                echo $item = substr($item,0,1);
            }
    }

surašiau komentarus, ką ir kaip kas daro, jei kam būtų neaišku. žinau, atrodo negražiai, bjaurus kodas ir pan. Tą suprantu :)
Tik pastebėjau tokį daiktą, kur kodas nesuveikia:

informatika bla bla -> ibb [suveikia]
informatika bla bla (bla bla) (bla bla) -> ibb(blbl)(bb) [suveikia]
informatika bla bla (bla bla) -> ibb (blbl) [nesuveikia]

reikia šitą eilutę paeditinti, kad tikrintų tik pirmus skliaustus.

$secondpart = preg_replace("/(.*?).\((.*?)\s(.*?)\).\((.*?)\)(.*)/e", "'('.substr('$2',0,2).''.substr('$3',0,2).')('.substr('$4',0,1).')'", $specialybe);

11 (edited by qutwala 2011-02-11 14:39:09)

Re: preg_match again (sutrumpinimai)

Už mindės kaži ar ką geriau rasi. :)
Pasiskaitinėk čia:
Nuoroda

Readaguota:

Regex Programikė(Asmeniškai nebandžiau, tik užmačiau ir pasidalinau)
Nuoroda (Dar vienas manual'as, tik daug platesnis. Beja, anglų kalba.)

Re: preg_match again (sutrumpinimai)

Na mokymosi tikslais galima prirašyti daug kodo, svarbu, kad to proceso metu tikrai kažką išmoktum (-; tada bus lengviau ateity ieškant geresnių ir lengvesnių sprendimų.

O dėl kodo supratimo, tai čia jau gana releatyvus dalykas ir kiekvienas asmeniškai tai vertina. Man tavo kodas daug painesnis (-;

Re: preg_match again (sutrumpinimai)

Tai tikiu, kur meleonas kodo ir kur viena eilutė. šiaip susidūriau su eiline problema, enkodingu:

$secondpart = preg_replace("/(.*?).\((.*?)\)/e", "'('.substr('$2',0,1).')'", $specialybe);
echo strtoupper($secondpart);

ir jeigu ateina stringas (šaka) tai ją paverčia į: (&#65533;), nors turėtų būti (š)
ką jau išbandžiau, tai
mb_substr - false, tada intike radau tokį sprendimą:

  $string="texto en espa&#241;ol";
  echo utf8_encode(substr(utf8_decode($string),0,14)); //Outputs: texto en espa&#241;

pritaikius jį, vietoj 'š' iįveda '?', vistiek false.

Ir dar šiaip toks klausimas stojasi, kodėl toks problematiškas php'o elgesys su enkodingu? Begale funkcijų matau, kad tvarkytis su utf-8, ir vistiek bendro sprendimo nepadaryta, o ir vieningo sprendimo neina pritaikyti. Vis kažkam kažkas ne taip suveikia :). Negilios programvimo žinios, man veda išvadą, kad implementintu į php kokį 'native' utf8 supportą ir atrodo išspręstų visas problemas... :)

14 (edited by qutwala 2011-03-01 11:48:10)

Re: preg_match again (sutrumpinimai)

Kiek bandžiau pažaisti su encoding'u, tai net nepadeda net mb_convert_encoding jeigu pats failas yra kokios ANSI koduotės, kas greičiausiai ir yra pas tavęs.
Pasikeisk pačio failo koduotę į "UFT-8 Without BOOM" ir ne bus jokio vargo.
Jeigu klystu pataisykit. :)


Warning: count(): Parameter must be an array or an object that implements Countable in /home/pasokime/domains/mysql.lt/public_html/forumas/include/parser.php on line 820

Re: preg_match again (sutrumpinimai)

Nusistatyk headeri meta utf-8 ir pasikeisk failo koduote is ANSII i UTF-8 kaip qutwala sake. Jei tai nepades tuomet busi antrasis Koperfieldas.

Re: preg_match again (sutrumpinimai)

JuliusGr wrote:

Ir dar šiaip toks klausimas stojasi, kodėl toks problematiškas php'o elgesys su enkodingu? Begale funkcijų matau, kad tvarkytis su utf-8, ir vistiek bendro sprendimo nepadaryta, o ir vieningo sprendimo neina pritaikyti. Vis kažkam kažkas ne taip suveikia :). Negilios programvimo žinios, man veda išvadą, kad implementintu į php kokį 'native' utf8 supportą ir atrodo išspręstų visas problemas... :)

PHP 6-oje versijoje šitas dalykas turėtų būti pakankamai sutvarkytas. O kodėl taip yra, tai čia jau reikia pasinagrinėti kokiomis aplinkybėmis ir tikslais tas PHP buvo sukurtas - mėgėjiškas scriptinimo įrankis.

Taip pat nesitikėk jokių didelių pokyčių minor versijose (-;

Re: preg_match again (sutrumpinimai)

Min2liz wrote:

Nusistatyk headeri meta utf-8 ir pasikeisk failo koduote is ANSII i UTF-8 kaip qutwala sake. Jei tai nepades tuomet busi antrasis Koperfieldas.

Matyt būsiu pastarasis, nes:

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ...

net nupaišiau skryną:
http://img96.imageshack.us/img96/340/utf8.png
Dar norėčiau pastebėti, kad 'kringėlis' atsiranda tik dirbant su preg_replace ir substr'ingu. Iš duomenų bazės paimant, viskas atrodo gražiai,
naudoju pačioj db 'utf8_general_ci', atvaizduoti naudoju jau minėtus <meta>, visi failai pas mane koduojami be BOM'o ir utf8, ir 'mysql_query("SET NAMES 'utf8'");'

18 (edited by Donatas 2011-03-02 09:37:05)

Re: preg_match again (sutrumpinimai)

man ir ta pati problema. Paimu texta is duomu bazes padarai substr ir jei paskutine raide lietuviska 'ąčęėįšųūž' meta klaustuka. bet tik paskutiniai raidiai. Kitas lietuviskas raides esanciais texte pries pabaiga rodo normaliai :)

Sprendimo kaip istaisyti tai neradau. Tai sudejau lietuviskas raides i array ir paskutine raide tikrinu ar ji lietuviska ar ne jei lietuviska pridedu 10 zenklu ir tikrinu:)

19 (edited by JuliusGr 2011-03-02 11:27:49)

Re: preg_match again (sutrumpinimai)

Iš preg_replace išsiaiškinau, kad cia substr bėdą daro: substr('šaka',0,1). Taip išeina, kad preg_replace susitvarko su lietuviškom raidėm, bet atejas iki substr, substr'ingas ją pameta... substr('šaka',0,1) => &#65533;.

Koks galėtų būdas buti, kad tiesiog, kad vietoj to kringelio aš tiesiog įterpinėčiau š raidę?
Galvoju, gal eitų kaipnors raidės koda repleisint, jeigu ateina toks kringelis... :)

Re: preg_match again (sutrumpinimai)

Kažką darai ne taip. Išbandžiau Linux ir Win, rezultatas tas pats:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
<body>
<?php
    echo "<p>preg_match</p>";
    $str = "ąčęėįšųūž";
    if (preg_match("/į/",$str,$t)) { echo "Radau"; }
    else { echo "Neradau"; }

    echo "<p>preg_replace</p>";
    $str = "Gerą dieną";
    echo preg_replace('/dieną/', 'vakarą', $str);
?>
</body>
</html>
OUTPUT:

preg_match

Radau
preg_replace

Gerą vakarą