10

テキストを文の配列に分割するにはどうすればよいですか?

テキスト例:

私にビーバーを揚げてください。ビーバーを揚げてくれ!ビーバーを揚げてくれませんか?フライミービーバーNo. 4?! 私にたくさんのビーバーを揚げてください...終わり

出力する必要があります:

0 => Fry me a Beaver.
1 => Fry me a Beaver!
2 => Fry me a Beaver?
3 => Fry me Beaver no. 4?!
4 => Fry me many Beavers...
5 => End

SOで検索して見つけたいくつかの解決策を試しましたが、特に4番目の文ですべて失敗しました。

/(?<=[!?.])./

/\.|\?|!/

/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])/

/(?<=[.!?]|[.!?][\'"])\s+/    // <- closest one
4

1 に答える 1

28

文を「分割」したいのに、なぜそれらを一致させようとしていますか?

この場合、preg_split()を使用しましょう。

コード:

$str = 'Fry me a Beaver. Fry me a Beaver! Fry me a Beaver? Fry me Beaver no. 4?! Fry me many Beavers... End';
$sentences = preg_split('/(?<=[.?!])\s+(?=[a-z])/i', $str);
print_r($sentences);

出力:

Array
(
    [0] => Fry me a Beaver.
    [1] => Fry me a Beaver!
    [2] => Fry me a Beaver?
    [3] => Fry me Beaver no. 4?!
    [4] => Fry me many Beavers...
    [5] => End
)

説明:

簡単に言うと、グループ化されたスペース\s+で分割し、次の2 つのことを行います。

  1. (?<=[.?!])アサーションの後ろの肯定的な見方。基本的には、スペースの後ろにポイントまたは疑問符または感嘆符があるかどうかを検索します。

  2. (?=[az])スペースの後に文字があるかどうかを検索する肯定的な先読みアサーション。これは、no. 4問題の一種の回避策です。

于 2013-05-04T18:47:33.127 に答える