ここで行う最も簡単な方法は、正規表現を記述してテキストをキャプチャし、キャプチャを解析して結果を確認することです。まず、テスト ベンチがあると仮定します。
$tests = array(
'Genesis 1:1' => 'Genesis Chapter 1, Verse 1',
'1 Kings 2:5' => '1 Kings Chapter 2, Verse 5',
'Job 3' => 'Job Chapter 3',
'Romans 8:1-7' => 'Romans Chapter 8, Verses 1 to 7',
'1 John 5:6-11' => '1 John Chapter 5, Verses 6 to 11'
);
つまり、左から右に次のようになります。
- ブック名。オプションで番号の前に付けます
- 章番号
- オプションの節番号。オプションで、その後に範囲が続きます。
したがって、これらすべてのケースに一致する正規表現を作成できます。
((?:\d+\s)?\w+)\s+(\d+)(?::(\d+(?:-\d+)?))?
そして、正規表現から返される結果を見てみましょう:
foreach( $tests as $test => $answer) {
// Match the regex against the test case
preg_match( $regex, $test, $match);
// Ignore the first entry, the 2nd and 3rd entries hold the book and chapter
list( , $book, $chapter) = array_map( 'trim', $match);
$output = "$book Chapter $chapter";
// If the fourth match exists, we have a verse entry
if( isset( $match[3])) {
// If there is no dash, it's a single verse
if( strpos( $match[3], '-') === false) {
$output .= ", Verse " . $match[3];
} else {
// Otherwise it's a range of verses
list( $start, $end) = explode( '-', $match[3]);
$output .= ", Verses $start to $end";
}
}
// Here $output matches the value in $answer from our test cases
echo $answer . "\n" . $output . "\n\n";
}
このデモで動作することがわかります。