<?php

$title[] = 'c005 - c009'; // c5-9
$title[] = 'c5.00 & c009'; // c5 & 9
$title[] = 'text c19 & c20 text'; //c19-20
$title[] = 'c19 & c20'; // c19-20
$title[] = 'text chapter 19 and chapter 25 text'; // c19 & 25
$title[] = 'text chapter 19 - chapter 23 and chapter 25 text'; // c19-23 & 25 (c19 for termless)
$title[] = 'text chapter 19 - chapter 23, chapter 25 text'; // c19-23 & 25 (c19 for termless)
$title[] = 'text chapter 23 text'; // c23
$title[] = 'text chapter 23, chapter 25-29 text'; // c23 & 25-29
$title[] = 'text chapters 23-26, 28, 29 + 30 + 32-39 text'; // c23-26 & c28-30 & c32-39
$title[] = 'text chapter 25.6 text'; // c25.6
$title[] = 'text chapters 23, 24, 25 text'; // c23-25
$title[] = 'text chapters 23+24+25 text'; // c23-25
$title[] = 'text chapter 23, 25 text'; // c23 & 25
$title[] = 'text chapter 23 & 24 & 25 text'; // c23-25
$title[] = 'text c25.5-30 text'; // c25.5-30
$title[] = 'text c99-c102 text'; // c99-102 (c99 for termless)
$title[] = 'text chapter 1 - 3 text'; // c1-3
$title[] = 'sometext 33 text chapter 1, 2 text 3'; // c1-2 or c33 if no terms
$title[] = 'text v2c5-10 text'; // c5-10 or c2 if no terms
$title[] = 'text cccc5-10 text'; // c5-10
$title[] = 'text chapters 23, 24, 25, 29, 31, 32 text'; // c23-25 & 29 & 31-32
$title[] = 'chapter 19 - chapter 23'; // c19-23 or c19 for termless
$title[] = 'chapter 12 part 2'; // c12

function get_chapter($text, $terms) {
  $rterms = sprintf('(?:%s)', implode('|', $terms));

  $and = '(?:  [,&+]|\band\b  )';
  $isrange = "(?:  \s*-\s*  $rterms?  \s*\d+  )";
  $isdotnum = '(?:\.\d+)';
  $the_regexp = "/(
    $rterms \s*  \d+  $isdotnum?  $isrange?   
    (  \s*  $and  \s*  $rterms?  \s*  \d+  $isrange?  )*
  )/mix";
  
  $result = array();
  $result['orignal'] = $text;
  if (preg_match($the_regexp, $text, $matches)) {
    $result['found_match'] = $tmp = $matches[1];
    $tmp = preg_replace("/$rterms\s*/i", '', $tmp);
    $tmp = preg_replace('/\s*-\s*/', '-', $tmp);
    $chapters = preg_split("/\s* $and \s*/ix", $tmp);
    $chapters = array_map(function($x) {
        return preg_replace('/\d\K\.0+/', '',
               preg_replace('/(?|\b0+(\d)|-\K0+(\d))/', '\1', $x
        ));
    }, $chapters);
    $chapters = merge_chapters($chapters);
	$result['converted'] = join_chapters($chapters);
  }
  else {
    $result['found_match'] = '';
	$result['converted'] = $text;
  }
  return $result;
}

function merge_chapters($chapters) {
  $i = 0;
  $begin = $end = -1;
  $rtchapters = array();
  foreach ($chapters as $chapter) {
    // Fetch next chapter
    $next = isset($chapters[$i+1]) ? $chapters[$i+1] : -1;
    // If not set, set begin chapter
    if ($begin == -1) {$begin = $chapter;}
    if (preg_match('/-/', $chapter)) {
      // It is a range, we reset begin/end and store the range
      $begin = $end = -1;
      array_push($rtchapters, $chapter);
    }
    else if ($chapter+1 == $next) {
      // next is current + 1, update end
      $end = $next;
    }
    else {
      // store result (if no end, then store current chapter, else store the range
      array_push($rtchapters, sprintf('%s', $end == -1 ? $chapter : "$begin-$end"));
      $begin = $end = -1; // reset, since we stored results
    }
    $i++; // needed for $next
  }
  return $rtchapters;
}

function join_chapters($chapters) {
  return 'c' . implode(' & ', $chapters) . "\n";
}

print "\nTERMS LEGEND:\n";
print "Case 1. = ['chapters', 'chapter', 'ch', 'c']\n";
print "Case 2. = []\n\n\n\n";
foreach ($title as $t) {
  // If some patterns start by same letters, use longest first.
  print "Original: $t\n";
  print 'Case 1. = ';
  $result = get_chapter($t, ['chapters', 'chapter', 'ch', 'c']);
  print_r ($result);
  print 'Case 2. = ';
  $result = get_chapter($t, []);
  print_r ($result);
  print "--------------------------\n";
}
