12

私は使用しています

explode(".",$mystring)

段落を文に分割します。ただし、これは、!などの異なる句読点で終了した文には適用されません。?:;

単一の文字の代わりに配列を区切り文字として使用する方法はありますか?あるいは、さまざまな句読点を使用して分割する別のきちんとした方法はありますか?

私は試した

explode(("." || "?" || "!"),$mystring)

うまくいけば、それはうまくいきませんでした...

4

8 に答える 8

19

PCRE先読み条件preg_split()と組み合わせて使用​​すると、実際の句読点をそのままにして、、、、、、、、..が出現するたびに文字列を分割できます。.;:?!

コード:

$subject = 'abc sdfs.    def ghi; this is an.email@addre.ss! asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);

結果:

Array
(
    [0] => abc sdfs.
    [1] => def ghi;
    [2] => this is an.email@addre.ss!
    [3] => asdasdasd?
    [4] => abc xyz
)

否定的な後読みアサーションを挿入することにより、独自の文に分割してはならない略語(Mr.、Mrs.、Dr。、..)のブラックリストを追加することもできます。

$subject = 'abc sdfs.   Dr. Foo said he is not a sentence; asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<!Mr.|Mrs.|Dr.)(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);

結果:

Array
(
    [0] => abc sdfs.
    [1] => Dr. Foo said he is not a sentence;
    [2] => asdasdasd?
    [3] => abc xyz
)
于 2012-05-08T07:21:42.157 に答える
6

できるよ:

preg_split('/\.|\?|!/',$mystring);

または(より単純):

preg_split('/[.?!]/',$mystring);
于 2012-05-08T07:13:11.713 に答える
2

最終結果の句読点が実際に必要であると仮定して、次のことを試しましたか。

 $mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring)));
 $tmp = explode("---",$mystring);

これにより、句読点がそのまま残ります。

于 2012-05-08T07:14:56.260 に答える
1
preg_split('/\s+|[.?!]/',$string);

考えられる問題は、途中で新しい行に分割される可能性があるため、電子メールアドレスがある場合です。

于 2012-05-08T07:14:47.200 に答える
0

preg_splitを使用し、[\。|\?!]のような正規表現を指定して分割します

于 2012-05-08T07:12:08.133 に答える
0
$mylist = preg_split("/[.?!:;]/", $mystring);
于 2012-05-08T07:13:04.407 に答える
0

分解するために複数の区切り文字を使用することはできません。それpreg_split();が目的です。ただし、それでも区切り文字で爆発するため、句読点なしで文が返されます。preg_splitをさらに一歩進めてフラグを立て、PREG_SPLIT_DELIM_CAPTUREを使用して独自の要素でそれらを返すことができます。次に、ループを実行して、返された配列の文とそれに続く句読点を内破するか、次を使用しますpreg_match_all();

preg_match_all('~.*?[?.!]~s', $string, $sentences);
于 2012-05-08T07:13:56.400 に答える
0

あなたが試すことができますpreg_split

$sentences = preg_split("/[.?!:;]+/", $mystring);

これにより句読点が削除されることに注意してください。先頭または末尾の空白も削除したい場合

$sentences = preg_split("/[.?!:;]+\s+?/", $mystring);
于 2012-05-08T07:15:05.873 に答える