Я тяну заголовки из романных сообщений. Цель состоит в том, чтобы с помощью регулярного выражения определить, в каких главах находится сообщение. Каждый сайт использует разные способы идентификации глав. Вот наиболее распространенные случаи:
$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
$title = 'text chapter 99 - chapter 102 text'; // c99-102
$title = 'text chapter 1 - 3 text'; // c1-3
$title = '33 text chapter 1, 2 text 3'; // c1-2
$title = 'text v2c5-10 text'; // c5-10
$title = 'text chapters 23, 24, 25, 29, 31, 32 text'; // c23-25 & 29 & 31-32
Номера глав всегда указаны в названии, только в разных вариантах, как показано выше.
Что я до сих пор
До сих пор у меня есть регулярное выражение для определения отдельных случаев глав, например:
$title = '9 text chapter 25.6 text'; // c25.6
Используя этот код (попробуйте ideone):
function get_chapter($text, $terms) {
if (empty($text)) return;
if (empty($terms) || !is_array($terms)) return;
$values = false;
$terms_quoted = array();
foreach ($terms as $term)
$terms_quoted[] = preg_quote($term, '/');
// search for matches in $text
// matches with lowercase, and ignores white spaces...
if (preg_match('/('.implode('|', $terms_quoted).')\s*(\d+(\.\d+)?)/i', $text, $matches)) {
if (!empty($matches[2]) && is_numeric($matches[2])) {
$values = array(
'term' => $matches[1],
'value' => $matches[2]
);
}
}
return $values;
}
$text = '9 text chapter 25.6 text'; // c25.6
$terms = array('chapter', 'chapters');
$chapter = get_chapter($text, $terms);
print_r($chapter);
if ($chapter) {
echo 'Chapter is: c'. $chapter['value'];
}
Как мне сделать эту работу с другими примерами, перечисленными выше? Учитывая сложность этого вопроса, я наберу его 200 очков, если это будет приемлемым.