2

基本的に、! などのあらゆる種類の句読点で満たされた段落を取り入れています。? . ; 私が直面している問題は、句読点をそのままにして、同時に会話の引用を考慮して文に分割する方法を考え出すことです。

たとえば、段落:

ある朝、グレゴール・ザムザが厄介な夢から覚めたとき、彼は自分のベッドで恐ろしい害獣に変身していることに気づきました。"何が起きたの!?" 彼は自問した。"知らない。" サムサは、「これは悪い夢かもしれない」と言いました。彼は甲冑のような背中に横たわり、少し頭を上げると、わずかに丸みを帯び、アーチで固い部分に分かれている茶色の腹が見えた。

このように分割する必要があります

[0] One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. 

[1] "What has happened!?" he asked himself.

[2] "I... don't know." said Samsa, "Maybe this is a bad dream."

等々。

現在、私は爆発を使用しています

$sentences = explode(".", $sourceWork);

ピリオドで分割し、最後にピリオドを追加するだけです。私が望んでいるものとはかけ離れていることはわかっていますが、これをどこから処理し始めればよいのかよくわかりません。誰かが少なくとも私に素晴らしいアイデアを探す正しい方向を教えてくれたら.

前もって感謝します!

4

3 に答える 3

3

ここに私が持っているものがあります:

<?php

/**
 * @param string $str                          String to split
 * @param string $end_of_sentence_characters   Characters which represent the end of the sentence. Should be a string with no spaces (".,!?")
 *
 * @return array
 */
function split_sentences($str, $end_of_sentence_characters) {
    $inside_quotes = false;
    $buffer = "";
    $result = array();
    for ($i = 0; $i < strlen($str); $i++) {
        $buffer .= $str[$i];
        if ($str[$i] === '"') {
            $inside_quotes = !$inside_quotes;
        }
        if (!$inside_quotes) {
            if (preg_match("/[$end_of_sentence_characters]/", $str[$i])) {
                $result[] = $buffer;
                $buffer = "";
            }
        }
    }
    return $result;
}

$str = <<<STR
One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. "What has happened!?" he asked himself. "I... don't know." said Samsa, "Maybe this is a bad dream." He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections.
STR;

var_dump(split_sentences($str, "."));
于 2012-09-22T21:03:14.173 に答える
0
preg_split('/[.?!]/',$sourceWork);

非常に単純な正規表現ですが、あなたのタスクは不可能だと思います。

于 2012-09-22T20:48:29.077 に答える
0

手動で文字列を調べて爆発させる必要があります。引用符の数を追跡します。奇数の場合は壊れません。ここに簡単なアイデアがあります。

    <?
//$str = 'AAA. BBB. "CCC." DDD. EEE. "FFF. GGG. HHH".';
$str = 'One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. "What has happened!?" he asked himself. "I... don\'t know." said Samsa, "Maybe this is a bad dream." He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections.';
$last_dot=0;
$quotation=0;
$explode_list = Array();
for($i=0;$i < strlen($str);$i++)
{
    $char = substr($str,$i,1);//get the currect character
    if($char == '"') $quotation++;//track quotation
    if($quotation%2==1) continue;//nothing to do so go back

    if($char == '.')
    {
        echo "char is $char $last_dot<br/>";
         $explode_list[]=(substr($str,$last_dot,$i+1-$last_dot));
         $last_dot = $i+1;
    }
}

echo "testing:<pre>";
print_r($explode_list);;
于 2012-09-22T20:57:40.047 に答える