1 SSN
* 2 PLAC 123-45-6789 Should really be: 1 SSN 123-45-6789
* this function checks if this exists
* @return boolean returns true if the cleanup is needed
* @see place_cleanup()
*/
function need_place_cleanup()
{
global $fcontents;
//$ct = preg_match("/SOUR.+(Family Tree Maker|FTW)/", $fcontents);
//if ($ct==0) return false;
$ct = preg_match_all ("/^1 (CAST|DSCR|IDNO|NATI|NCHI|NMR|OCCU|PROP|RELI|SSN|TITL|_FA1|_FA2|_FA3|_FA4|_FA5|_FA6)(\s*)$[\s]+(^2 TYPE(.*)[\s]+)?(^2 DATE(.*)[\s]+)?^2 PLAC (.*)$/m",$fcontents,$matches, PREG_SET_ORDER);
if($ct>0)
return $matches[0];
return false;
}
/**
* clean up the bad places found by the need_place_cleanup() function
* @return boolean returns true if cleanup was successful
* @see need_place_cleanup()
*/
function place_cleanup()
{
global $fcontents;
//searchs for '1 CAST|DSCR|IDNO|NATI|NCHI|NMR|OCCU|PROP|RELI|SSN|TITL #chars\n'
// 'optional 2 TYPE #chars\n'
// 'optional 2 DATE #chars\n'
// '2 PLAC #chars'
// and replaces the 1 level #chars with the PLAC #chars and blanks out the PLAC
$fcontents = preg_replace("/^1 (CAST|DSCR|IDNO|NATI|NCHI|NMR|OCCU|PROP|RELI|SSN|TITL|_FA1|_FA2|_FA3|_FA4|_FA5|_FA6)(\s*)$[\s]+(^2 TYPE(.*)[\s]+)?(^2 DATE(.*)[\s]+)?^2 PLAC (.*)$/m",
fixreplaceval('$1','$7','$3','$5'),$fcontents);
return true;
}
//used to create string to be replaced back into GEDCOM
function fixreplaceval($val1,$val7,$val3,$val5)
{
$val = "1 ".$val1." ".trim($val7)."\n";
//trim off trailing spaces
$val3 = rtrim($val3);
if(!empty($val3))
$val = $val.$val3;
//trim off trailing spaces
$val5 = rtrim($val5);
if(!empty($val5))
{
$val = $val.$val5;
}
//$val = $val."\r\n2 PLAC";
return trim($val);
}
/**
* check if we need to cleanup the dates
*
* Valid gedcom dates are in the form DD MMM YYYY (ie 01 JAN 2004). However many people will enter
* dates in an incorrect format. This function checks if dates have been entered incorrectly.
* This function will detect dates in the form YYYY-MM-DD, DD-MM-YYYY, and MM-DD-YYYY. It will also
* look for \ / - and . as delimeters.
* @return boolean returns true if the cleanup is needed
* @see date_cleanup()
*/
function need_date_cleanup()
{
global $fcontents;
$ct = preg_match_all ("/\n\d DATE[^\d]+(\d\d\d\d)[\/\\\\\-\.](\d\d)[\/\\\\\-\.](\d\d)/",$fcontents,$matches, PREG_SET_ORDER);
if($ct>0) {
return $matches[0];
}
else
{
$ct = preg_match_all ("/\n\d DATE[^\d]+(\d\d)[\/\\\\\-\.](\d\d)[\/\\\\\-\.](\d\d\d\d)/",$fcontents,$matches, PREG_SET_ORDER);
if($ct>0) {
// The user needs to choose between DMY and MDY
$matches[0]["choose"] = true;
return $matches[0];
}
else {
$ct = preg_match_all ("/\n\d DATE ([^\d]+) [0-9]{1,2}, (\d\d\d\d)/",$fcontents,$matches, PREG_SET_ORDER);
if($ct>0) {
return $matches[0];
}
else {
$ct = preg_match_all("/\n\d DATE (\d\d)[^\s]([^\d]+)[^\s](\d\d\d\d)/", $fcontents, $matches, PREG_SET_ORDER);
if($ct>0) {
return $matches[0];
} else {
if (preg_match_all("/^\d DATE (BET|FROM) \d\d? (AND|TO) \d\d? \w\w\w \d\d\d\d/m", $fcontents, $matches, PREG_SET_ORDER)) {
return $matches[0];
}
}
}
}
}
return false;
}
function changemonth($monval)
{
if($monval=="01") return "JAN";
elseif($monval=="02") return "FEB";
elseif($monval=="03") return "MAR";
elseif($monval=="04") return "APR";
elseif($monval=="05") return "MAY";
elseif($monval=="06") return "JUN";
elseif($monval=="07") return "JUL";
elseif($monval=="08") return "AUG";
elseif($monval=="09") return "SEP";
elseif($monval=="10") return "OCT";
elseif($monval=="11") return "NOV";
elseif($monval=="12") return "DEC";
return $monval;
}
/**
* clean up the bad dates found by the need_date_cleanup() function
* @return boolean returns true if cleanup was successful
* @see need_date_cleanup()
*/
function date_cleanup($dayfirst=1)
{
global $fcontents;
// Run all fixes twice, as there can be two dates in each DATE record
// Convert ISO/Japanese style dates "2000-12-31"
$fcontents=preg_replace("/2 DATE (.*)(\d\d\d\d)\W(0?[1-9]|1[0-2])\W(\d\d)/e", "'2 DATE $1$4 '.changemonth('$3').' $2'", $fcontents);
$fcontents=preg_replace("/2 DATE (.*)(\d\d\d\d)\W(0?[1-9]|1[0-2])\W(\d\d)/e", "'2 DATE $1$4 '.changemonth('$3').' $2'", $fcontents);
// Convert US style dates "FEB 14, 2000" or "February 5, 2000"
$fcontents=preg_replace("/2 DATE (.*)((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[A-Z]*) (\d{1,2}), (\d{4})/i", "2 DATE $1$4 $3 $5", $fcontents);
$fcontents=preg_replace("/2 DATE (.*)((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[A-Z]*) (\d{1,2}), (\d{4})/i", "2 DATE $1$4 $3 $5", $fcontents);
// Convert non-space delimiters "12-DEC-2000" or "01/02/2000"
// Without the "ungreedy" qualifier, this regex won't match the first of a pair of dates and
// with it, it won't match the second. Not sure why.
$fcontents=preg_replace("/2 DATE (.*?)(\d\d?)\W(\w+)\W(\d\d\d\d)/", "2 DATE $1$2 $3 $4", $fcontents);
$fcontents=preg_replace("/2 DATE (.*)(\d\d?)\W(\w+)\W(\d\d\d\d)/", "2 DATE $1$2 $3 $4", $fcontents);
if ($dayfirst==1) {
// Interpret numeric dates as DD MM YYYY
$fcontents=preg_replace("/2 DATE (.*)(\d\d?) (0?[1-9]|1[0-2]) (\d\d\d\d)/e", "'2 DATE $1$2 '.changemonth('$3').' $4'", $fcontents);
$fcontents=preg_replace("/2 DATE (.*)(\d\d?) (0?[1-9]|1[0-2]) (\d\d\d\d)/e", "'2 DATE $1$2 '.changemonth('$3').' $4'", $fcontents);
} else if ($dayfirst==2) {
// Interpret numeric dates as MM DD YYYY
$fcontents=preg_replace("/2 DATE (.*)(0?[1-9]|1[0-2]) (\d\d?) (\d\d\d\d)/e", "'2 DATE $1$3 '.changemonth('$2').' $4'", $fcontents);
$fcontents=preg_replace("/2 DATE (.*)(0?[1-9]|1[0-2]) (\d\d?) (\d\d\d\d)/e", "'2 DATE $1$3 '.changemonth('$2').' $4'", $fcontents);
}
// Convert "BET 1 AND 11 JUN 1900" to "BET 1 JUN 1900 AND 11 JUN 1900"
$fcontents=preg_replace("/^(\d DATE) (BET|FROM) (\d\d?) (AND|TO) (\d\d?) (\w\w\w \d\d\d\d)/m", '$1 $2 $3 $6 $4 $5 $6', $fcontents);
return true;
}
/**
* convert XREFs to the value of another tag in the gedcom record
*
* Some genealogy applications do not maintain the gedcom XREF IDs between gedcom exports
* but instead use another Identifying tag in the Gedcom record. This function will allow
* the admin to replace the XREF IDs with the value of another tag. So for example you could replace
* the 0 @I1@ INDI with the value of the RIN tag R101 making the line look like this 0 @R101@ INDI
* @param String $tag the alternate tag in the gedcom record to use when replacing the xref id, defaults to RIN
*/
function xref_change($tag="RIN")
{
global $fcontents;
global $GEDCOM;
$ged_id=get_id_from_gedcom($GEDCOM);
//-- find all of the XREFS in the file
$ct = preg_match_all("/0 @(.*)@ INDI/", $fcontents, $match, PREG_SET_ORDER);
for($i=0; $i<$ct; $i++) {
$xref = trim($match[$i][1]);
$indirec = find_gedcom_record($xref, $ged_id, true);
if ($indirec) {
$rt = preg_match("/1 NAME (.*)/", $indirec, $rmatch);
if($rt>0)
{
$name = trim($rmatch[1])." (".$xref.")";
$name = str_replace("/","",$name);
}
else
$name = $xref;
// print "Found record $i - $name: ";
$rt = preg_match("/1 $tag (.*)/", $indirec, $rmatch);
if ($rt>0) {
$rin = trim($rmatch[1]);
$fcontents = str_replace("@$xref@", "@$rin@", $fcontents);
// print "successfully set to $rin
\n";
}
else print "No $tag found in record
\n";
}
}
return true;
}