+ Svara på ämne
Resultat 1 till 8 av 8

Ämne: PHP och släktforskning

  1. #1
    Cognatuss avatar
    Jonas Magnusson
    Medlemsnr
    40573
    Ort
    Vänge, Uppsala
    Inlägg
    27

    PHP och släktforskning

    Jag tänkte starta upp en tråd där man kan presentera och diskutera PHP-kod och snippets användbara när man programmerar för släktforskning.

    Först ut blir en regexp för validering av SVARS BildID som jag förstår det är uppbyggt så här:

    Strängen börjar på ett A eller ett C
    - därefter 7 siffror (detta räcker för att hitta rätt volym)
    - om den är mer specifikt (sida) kommer sedan underscore samt 5 siffror.

    A1234567 eller A1234567_1234

    Kan valideras enligt nedan:

    PHP-kod:
        $pattern '/^[AC]{1}+[0-9]{7}$|^[AC]{1}+[0-9]{7}+_{1}+[0-9]{5}$/'
        
    $svarid "A1234567_12345";
         
        if (
    preg_match($pattern,$svarid)) echo "Match";
        else echo 
    "Not match"
    Senast redigerad av Cognatus den 2014-05-31 klockan 01:36.
    Jonas Magnusson
    www.cognatus.se


  2. #2
    Cognatuss avatar
    Jonas Magnusson
    Medlemsnr
    40573
    Ort
    Vänge, Uppsala
    Inlägg
    27
    För Arkiv Digitals bildid AID som är uppbyggt av tre delar ser det ut så här:

    Först ett v följt av 2 till gissningsvis 6 siffror (räcker för volym)
    - sen ett b följt av gissningsvis max 4 siffror för bild
    - sen om sidnumrering finns ett s följt av gissningsvis max 4 siffror

    v123456
    v123456.b1234
    v123456.b1234.s1234

    Kan valideras enligt nedan:

    PHP-kod:
     $pattern '/^v[0-9]{2,6}$|^v[0-9]{2,6}+\.b[0-9]{1,4}$|^v[0-9]{2,6}+\.b[0-9]{1,4}+\.s[0-9]{1,4}$/'
        
    $aid "v123456.b1234.s1234";
         
        if (
    preg_match($pattern,$aid)) echo "Match";
        else echo 
    "Not match"
    Jonas Magnusson
    www.cognatus.se


  3. #3
    Cognatuss avatar
    Jonas Magnusson
    Medlemsnr
    40573
    Ort
    Vänge, Uppsala
    Inlägg
    27
    Jag har fått lite feedback från AD som förklarar hur deras AID är uppbyggt...

    "v följt av en integer, följt av en bokstav (a-z) för volym. Bokstaven talar om vilken version av volymen det är.
    b följt av en integer för bild-nummer
    s följt av en sträng för sida. Det kan finnas lite vad som helst i den strängen men oftast är det mest siffror. "


    Vilket innebär att följande regexp är bättre:

    PHP-kod:
    $pattern '/^v[0-9]{2,}+[a-z]{0,1}$|^v[0-9]{2,}+[a-z]{0,1}+\.b[0-9]{1,}$|^v[0-9]{2,}+[a-z]{0,1}+\.b[0-9]{1,}+\.s[0-9a-z]{1,}$/'
        
    $aid "v123456a.b1234.s1234a";
         
        if (
    preg_match($pattern,$aid)) echo "Match";
        else echo 
    "Not match"
    Jonas Magnusson
    www.cognatus.se


  4. #4
    Phryxes avatar
    C-G Magnusson
    Medlemsnr
    13088
    Inlägg
    973
    Det var länge sedan jag höll på med Regex. Jag funderar på om plustecknen ska vara där när du redan angett hur många tecken det ska vara. Är inte heller säker på om man kan skriva flera regex-patterns i en sträng.

  5. #5
    Cognatuss avatar
    Jonas Magnusson
    Medlemsnr
    40573
    Ort
    Vänge, Uppsala
    Inlägg
    27
    Det funkar som det ska!

    De olika varianterna av sträng går igenom, men inget annat.

    /Jonas
    Senast redigerad av Cognatus den 2014-06-06 klockan 22:03.
    Jonas Magnusson
    www.cognatus.se


  6. #6

    Bror Johansson
    Medlemsnr
    8633
    Inlägg
    196
    Om PHP vet jag föga. Ett vet jag dock, nämligen att preg-funktionerna kapslar in PCRE-lib. Det innebär att regexpsyntaxen är lika med den som används i Perl, vilket i sin tur medför att ett RE som matchar AID, torde kunna skrivas: "^v(\d+)[a-z]b(\d+)s(.+)$" (med reservation för hur strängliteraler formuleras i PHP). Grupp-parenteserna kan tas bort om behov av att hämta ut volym-nr, bild-nr och sid-id, inte finns.

    Om sid-id kan innehålla tecken från hela Unicode-rymden, så kan uttrycket behöva skrivas: "^v(\d+)[a-z]b(\d+)s(\X+)$".

    Jag antar att ett AID alltid innehåller alla tre info-delarna. Om avslutande del/delar kan saknas, så behöver uttrycket se ut sålunda: "^v(\d+)[a-z](b(\d+)(s(.+))?)?$".

  7. #7

    Janåke Gestblom
    Medlemsnr
    36899
    Ort
    Stockholm
    Inlägg
    99
    BrJohan, du missar ett ? och punkterna.
    Kruxet med AID är "Det kan finnas lite vad som helst i den strängen men oftast är det mest siffror". Det finns alltså inget klart definierat slut. För att hitta isolera AID ur en text måste man anta att det inte slutar med "lite vad som helst".
    Mitt förslag blir: "/v(\d+)[a-z]?((\.b(\d+))?(\.s\w+)?)?/".

  8. #8

    Bror Johansson
    Medlemsnr
    8633
    Inlägg
    196
    Vad punkterna beträffar så har du helt rätt. Jag förbisåg dem därför att de inte nämndes i citatet ur AD's feedback.

    Mitt RE-förslag baserades på, liksom det från Cognatus, att det gäller matchning och inte sökning.

    Med "lite vad som helst" i avslutningssekvensen antog jag att även bl.a. blanktecken kan förekomma. Jag antog också att volymbokstav alltid finns eftersom den anges vara versionsidentifierande.

+ Svara på ämne

Behörigheter för att posta

  • Du får inte posta nya ämnen
  • Du får inte posta svar
  • Du får inte posta bifogade filer
  • Du får inte redigera dina inlägg