-2

文字列を解析し、2 つの区切り記号の間の数字を取得する必要があります。それらが数字であることを確認する必要があります。このようなことを試しましたが、期待どおりに機能しません。

if (preg_match_all("/[^0-9](?<=First)(.*?)(?=Second)/s", $haystack, $result))
for ($i = 1; count($result) > $i; $i++) {
    print_r($result[$i]);
}

正規表現の何が問題になっていますか?

4

2 に答える 2

1

ええと、それは私があなたの他の質問に提供したものとほぼ同じですxD

(.*?)をに変更([0-9]+)

if (preg_match_all("/(?<=First)([0-9]+)(?=Second)/s", $haystack, $result))
for ($i = 1; count($result) > $i; $i++) {
    print_r($result[$i]);
}

.*?は任意の文字 (改行を除く) と一致し、区切り文字 "First" と "Second" の間の数字のみに一致するには、それを に変更する必要があります[0-9]。次に、それらの間に何もないことはできないと想定しているため、 a の+代わりに aを使用し*ます。

なぜあなた[^0-9]が最初に使ったのか分かりません。通常[^0-9]、数字ではない 1 文字を意味し、少なくとも私の意見では、そこに置くことは実際には何の役にも立ちません。


少しクリーンアップすると、必要な出力を得るために不要なものをいくつか削除できます。

if (preg_match_all("/(?<=First)[0-9]+(?=Second)/", $haystack, $result))
   print_r($result[0]);
于 2013-08-13T18:40:09.897 に答える
0

[0-9]またはを使用\dして、区切り文字の間の文字が数字であることを確認できます。これを使用すると、遅延量指定子も必要ありません (区切り文字が実際に数値でない限り)。

preg_match_all("/[^0-9](?<=First)(\d*)(?=Second)/s", $haystack, $result)

または

preg_match_all("/[^0-9](?<=First)([0-9]*)(?=Second)/s", $haystack, $result)
于 2013-08-13T18:40:11.283 に答える