Jump to content
php.lv forumi

Blokveida meklēšana rakstzīmju virknē


hawklv

Recommended Posts

Sveiki.
Vēršos pie jums ar jautājumu vai source koda lūgumu. Jo nu ir sanācis tā ka man ir
pavisam maz laika un izdomāt ko tādu paša spēkiem prasīs pārāk daudz laika un pieņemu ka man ir pārāk maz
zināšanu šajā valodā.

Pamatā vēlos no teksta gabala jeb vienas rakstzīmju kopas 

$teksts="rakstzimju kopa te....";

 iegūt informāciju pa daļām..
Piemēram:
 

$string = "
Apraksts Jauki puisi

Vardi Andris Petertis
Viktors Janis

Dzimsanas dati
1984.gada 2.feb
1992.gada 15jun.
1989.gada 25.feb
1999.gada 1.aug.
";

izmantojot atslēgvārdus  rezultāts būtu šāds
 

$vardi = "Andris Peteris Viktors Janis";
$dz_dat = "1984.gada 2.feb 1992.gada 15jun. 1989.gada 25.feb 1999.gada 1.aug.";
$apraksts = "Jauki puisi"

Pamatā doma ir tāda ka ir piemēram 3 atslēgvārdi - "Apraksts ", "Dzimšanas dati" , "Vardi" un tie tiek meklēti rakstzīmju virknē.
Kad vārds tiek atrasts, no tās vietas kur tas atrodas, tiek iegūtā informācija līdz nākamajam atslēgvārdam vai ari ja visi ir izmantoti līdz teksta beigām.  
Viss itkā būtu samērā vienkārši bet problēma ir tāda ka teksts ko vēlos analizēt ne vienmēr būs vienāds..Tas var būt jaukts..bez nākamās rindiņas, mainīts izkārtojums untt..
Līdzīgi kā attēlā.. (3 dažādos variantos)
1r8nqwwbyn3xyicwhlmr.png




no sākuma ienāca prātā doma ka varētu noteikt katra atslēgvārda pozīciju.. ar strpos(virkne,'atslegvards')
tad rēķināt starpību 
un beigas iegūt nepieciešamo informāciju ar - substr(virkne, $pozicija, -starpiba);
Bet tas viss radīja pamatīgu mudžekli un pie jauktas secības ieguva nepareizu informāciju..

Pieļauju ka kāds no jums jau iepriekš ir strādājis ar ko tādu un varētu izpalīdzēt
ideālākais variants būtu tad ja kāds iedotu gatavu source kodu priekš piemēra, jo man ir samērā maz laika līdz projekta nodošanai un bez šīs lietas ir vel daudz cita darāmā.

-Ceru uz sapratni.
 

Link to comment
Share on other sites

šeit regex noderētu vislabāk, bet še tev quick-and-dirty variants ( zinu, gan ka šas izpelnīšos daudz lamuvārdu par šo, bet ir darbadienas beigas un man slinkums ):

$string = "
Apraksts Jauki puisi

Vardi Andris Petertis
Viktors Janis

Dzimsanas dati
1984.gada 2.feb
1992.gada 15jun.
1989.gada 25.feb
1999.gada 1.aug.
";

$keywords = array( 'Apraksts', 'Vardi', 'Dzimsanas dati' );

$parts = explode( PHP_EOL, $string );

$result = array();

foreach( $parts as $value ) {
    $value = str_replace( array( "\n", "\r", "\t" ), '', $value );
    if ( $value != '' ) {
        foreach( $keywords as $keyword  ){
            if ( strpos( $value, $keyword ) !== false ) {
                $key = $keyword;
                $result[$key][] = str_replace( $key, '', $value );
            }
        }
        array_push( $result[$key], str_replace( $key, '', $value ) );
    }
}

foreach( $result as $key => $value ) {
    $result[$key] = array_unique( array_filter( $value ) );
}

print_r( $result );

Output:

Array
(
    [Apraksts] => Array
        (
            [0] =>  Jauki puisi
        )

    [Vardi] => Array
        (
            [0] =>  Andris Petertis
            [2] => Viktors Janis
        )

    [Dzimsanas dati] => Array
        (
            [2] => 1984.gada 2.feb
            [3] => 1992.gada 15jun.
            [4] => 1989.gada 25.feb
            [5] => 1999.gada 1.aug.
        )

)

0.0004sec
Link to comment
Share on other sites

Vari mēģināt izmantot šādas regulārās izteiksmes:

Lai atrastu 'Vardi' - > /Vardi(.*?)(?=Dzimsanas dati|Apraksts|\Z)/mig

Lai atrastu 'Apraksts' -> /Apraksts(.*?)(?=Dzimsanas dati|Vardi|\Z)/mig

Lai atrastu 'Dzimsanas dati' -> /Dzimsanas dati(.*?)(?=Vardi|Apraksts|\Z)/mig

Link to comment
Share on other sites

$s = "
Apraksts Jauki puisi

Vardi Andris Petertis
Viktors Janis

Dzimsanas dati
1984.gada 2.feb
1992.gada 15jun.
1989.gada 25.feb
1999.gada 1.aug.
";

$kw = array("Apraksts", "Vardi", "Dzimsanas dati");
$r = array();
foreach($kw as $v){
    $s = str_replace($v, '|' . $v . '*', $s);
}
foreach(explode('|', trim(trim($s), '|')) as $v){
    list($i,$j) = explode('*', trim($v));
    $r[$i] = array_filter(explode("\n", trim($j)));
}

var_dump($r);

Nezinu, priekš kam jaukts regulārās izteiksmes, ja var ar elementārām str funkcijām visu izdarīt. Ar regexp'iem tik sapīties meistarībā...

Link to comment
Share on other sites

Atvainojos ka neatbildēju un ceļu augšā pavecu topiku. jo tiešam biju noslogots visu šo laiku.
Vēlējos pateikt Paldies visiem kuri piedāvāja Source kodu un centās izpalīdzēt! 
Tiešam Paldies! 
Izdevās projektu nodot laicīgi un viss tiešam lieti noderēja!

Amm. Ievākti dati tiek caur DOM .. pēc tam kodā meklējot tiek izvilkti kā teksta formāta bloks.. iespējams to varēja nedaudz savādāk izveidot, bet 
mani apmierināja tas ko ieguvu līdz šim - rakstzīmju (String) faila formātā ,tāpēc vēlējos to tā ari atstāt .
 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...