$re = '/(?:\bchapters?|c+)\s*((?:\s*([,&+]|and)?\s*(?:chapter|c)?\s*\d+(?:\.\d+)?(?:\s*-\s*(?:chapter|c)?\s*\d+)?)+)/m';
$str = '$title[] = \'c19 & c20\';
$title[] = \'text c19 & c20 text\';
$title[] = \'text chapter 19 and chapter 25 text\';
$title[] = \'text chapter 19 - chapter 23 and chapter 25 text\';
$title[] = \'text chapter 19 - chapter 23, chapter 25 text\';
$title[] = \'text chapter 23 text\';
$title[] = \'text chapter 23, chapter 25-29 text\';
$title[] = \'text chapters 23-26, 28, 29 + 30 + 32-39 text\';
$title[] = \'text chapter 25.6 text\';
$title[] = \'text chapters 23, 24, 25 text\';
$title[] = \'text chapters 23+24+25 text\';
$title[] = \'text chapter 23, 25 text\';
$title[] = \'text chapter 23 & 24 & 25 text\';
$title[] = \'text c25.5-30 text\';
$title[] = \'text c99-c102 text\';
$title[] = \'text chapter 1 - 3 text\';
$title[] = \'33 text chapter 1, 2 text 3\';
$title[] = \'text v2c5-10 text\';
$title[] = \'text cccc5-10 text\';
$title[] = \'text chapters 23, 24, 25, 29, 31, 32 text\';
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php