1

多くの外国の文字と数字を含むテキストを、長さ> = 2で句読点のない単語と数字に分割しようとしています(preg_splitを使用)。今、私はこのコードを持っていますが、数字と長さ>= 2を考慮せずに単語に分割するだけです。どうすればいいですか?

$text = 'abc 文 字化け, efg Yukarda mavi gök, asağıda yağız yer yaratıldıkta; (1998 m. siejės 7 d.). Ton pate dėina bandomkojė бойынша бірінші орында тұр (79.65 %), айына 41';
$splitted = preg_split('#\P{L}+#u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

期待される結果は次のとおりです。array('abc', '字化け', 'efg', 'Yukarda', 'mavi', 'gök', 'asağıda', 'yağız', 'yer', 'yaratıldıkta', '1998', 'siejės', 'Ton', 'pate', 'dėina', 'bandomkojė', 'бойынша', 'бірінші', 'орында', 'тұр', '79.65', 'айына', '41');

NB : すでにこれらのドキュメントlink1link2で試しましたが、うまくいきません :-/

4

3 に答える 3

2

代わりにpreg_match_allを使用すると、長さの条件を確認できます (preg_split では難しいですが、不可能ではありません)。

$text = 'abc 文 字化け, efg Yukarda mavi gök, asağıda yağız yer yaratıldıkta; (1998 m. siejės 7 d.). Ton pate dėina bandomkojė бойынша бірінші орында тұр (79.65 %), айына 41';
preg_match_all('~\p{L}{2,}+|\d{2,}+(?>\.\d++)?|\d\.\d++~u',$text,$matches);
print_r($matches);

説明:

   p{L}{2,}+          # letter 2 or more times
|                  # OR
   \d{2,}+            # digit 2 or more times
   (?>\.\d++)?        # can be a decimal number
|                  # OR
   \d\.\d++           # single digit MUST be followed by at least a decimal 
                      # (length constraint)
于 2013-06-02T22:56:41.540 に答える
1

単語の一部として数字のみを照合する前に、ドットで区切られた数字を照合するためのちょっとしたハック:

preg_match_all("#(?:\d+\.\d+|\w{2,})#u", $text, $matches);
$splitted = $matches[0];

http://codepad.viper-7.com/X7Ln1V

于 2013-06-02T23:07:48.970 に答える
0

CJKを「単語」に分割することは、意味がありません。各文字は単語です。空白を使用すると、フレーズに分割されます。

したがって、実際に達成しようとしていることに依存します。テキストにインデックスを付ける場合は、バイグラムや CJK イディオムを考慮する必要があります。

于 2013-06-02T23:09:53.447 に答える