handdator

Visa fullständig version : PHP och släktforskning



Cognatus
2014-05-31, 00:34
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:


$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";

Cognatus
2014-05-31, 16:48
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:


$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";

Cognatus
2014-06-02, 22:15
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:


$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";

Phryxe
2014-06-05, 13:31
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.

Cognatus
2014-06-06, 18:02
Det funkar som det ska! :)

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

/Jonas

BrJohan
2014-06-08, 17:45
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(.+))?)?$".

Gestblom
2014-06-16, 14:15
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+)?)?/".

BrJohan
2014-07-09, 15:54
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.