0

誰かが詩のフォーマットを3つの部分に分割/分解する方法を教えてもらえますか?

条件は以下のようになります。

2番目と3番目の部分はコロンで区切る必要があります。たとえば創世記1:1で

次のように分離する必要があります

[0] = Gen
[1] = 1
[2] = 1

スペース(またはユーザーフレンドリーにするために多くのスペース)とコロンで区切られます

第二に、前に数字がある詩では、ユーザーがそれを次のように入力できるため、問題があります

1 Cor 1:1であり、1Cor 1:1と入力することもできます。

いずれの場合も、[1]と[2]をコロンで分割し、残りの部分をすべてのスペースでトリミングして[0]の値にします。

これは可能ですか?私は詩の検索に1つのテキストボックスのみを使用することを考えているので、phpはそれをクエリとして渡す前にそれに応じて検証します。

ありがとう

4

4 に答える 4

1

うまくいくと思われる次のパターンを思いつきました。これを試して:

<?php

$string = '7 Genesis 16:23';

if (preg_match('/^(.*?)\s+(\d+):(\d+)$/', $string, $match)) {
    echo "You selected book {$match[1]}, chapter {$match[2]}, verse {$match[3]}!";
} else {
    echo "I couldn't understand your input.  Please use 'Book chapter:verse' format.";
}

式の最初の部分は(.*?)本 (1 Cor) または単に (Cor) と一致するため、その部分で追加の検証を行うか、それを改良する必要がある/したい場合がありますが、これは私にとっては問題なく機能しました。うまくいけば、あなたが始めることができます。

于 2012-06-13T00:29:02.090 に答える
0

このパターンは機能するはずです:

$subject = <<verse here>>;
$pattern = '/^([0-9a-zA-Z ]+) ([0-9]+):([0-9]+)/';
preg_match($pattern, $subject, $matches);
print_r($matches);

の最初の要素$matchesは完全な$subjectになることに注意してください。要素1〜3は、要素0〜2にマップされます。

于 2012-06-13T00:30:55.850 に答える
0

したがって、次の順序で必要なようです。

  • 一部のテキスト(おそらくスペースはそうではないかもしれません)(.*)
  • 一部のスペース(少なくとも1つ)[ ]+
  • 数字(1桁以上)([0-9]+)
  • コロン:
  • 別の数字(1桁以上)([0-9]+)

したがって、正規表現は次のようになります。

/^(.*)[ ]*([0-9])+:([0-9]+)$/

これを実行した後:

$m = '1 Cor 3:14';
$matches = array();
preg_match("/^(.*)[ ]*([0-9])+:([0-9]+)$/", $m, $matches); 

$matches次のようになります。

Array
(
    [0] => 1 Cor 3:14
    [1] => 1 Cor 
    [2] => 3
    [3] => 14
)
于 2012-06-13T00:32:44.673 に答える
0

次のようなことを試してください:

$str = 'Gen 1:1'; // OR: $str = '1 Cor 1:1';
$array = explode( ' ', $str);
$last = end( $array);
$array = array_merge( array_slice( $array, 0, count( $array) - 1), explode( ':', $last));
var_dump( $array);

デモ

于 2012-06-13T00:29:01.937 に答える