1

英数字以外の文字で文字列を分割しようとしていたか、単語を分割したいのです。すぐに頭に浮かんだのは、正規表現を使うことです。

例:
$string = 'php_php-php php';
$splitArr = preg_split('/[^a-z0-9]/i', $string);

しかし、このアプローチには2つの問題があります。

  1. これはネイティブのphp関数ではなく、サーバーで実行されているPCREライブラリに完全に依存しています。
  2. 同様に重要な問題は、単語に句読点がある場合はどうなるかということです。
    例: これで文字列がこぼれますが 、
    $string = 'U.S.A-men's-vote';
    $splitArr = preg_split('/[^a-z0-9]/i', $string);

    [{U}{S}{A}{men}{s}{vote}]
    [{U.S.A}{men's}{vote}]

だから私の質問はそれです:

  • どうすれば単語ごとに分割できますか?
  • phpネイティブ関数を使用して、または依存していない他の方法でそれを行う可能性はありますか?

よろしく

4

4 に答える 4

3

PHPがインストールされている(PCREもインストールされている)か、インストールされていないかのどちらかです。したがって、最初のポイントは問題ではありません。

次に、分割区切り文字から句読点を除外する場合は、句読点を文字クラスに追加する必要があります。

preg_split('/[^a-z0-9.\']+/i', $string);

句読文字をコンテキストに応じて異なる方法で処理する場合(たとえば、ドットの後に空白が続く場合にのみドットを区切り文字にする)、それも可能です。

preg_split('/\.\s+|[^a-z0-9.\']+/i', $string);
于 2012-10-24T10:47:52.853 に答える
3

str_word_count()の場合、2番目の引数に忘れられがちな1または2の値を使用し、3番目の引数にハイフン、ピリオド、アポストロフィ(または単語の一部として扱いたいその他の文字)を一部として含める場合のように聞こえます一言で言えば; 続いてarray_walk()を実行して、結果の配列値の最初または最後からこれらの文字をトリミングします。これにより、実際に「単語」に埋め込まれている場合にのみ文字を含めることができます。

于 2012-10-24T10:58:28.517 に答える
1

私のコメントによると、あなたは試してみたいかもしれません(必要な数のセパレーターを追加してください)

$splitArr = preg_split('/[\s,!\?;:-]+|[\.]\s+/', $string, -1, PREG_SPLIT_NO_EMPTY);

次に、「引用符で囲まれた」単語の場合を処理する必要があります(「これ」は引用符で囲まれているので、正規表現で行うのはそれほど簡単ではありませんか?そしてどのように?)。

したがって、「」と「」を単語内に保持して(「それ」は単一の単語で、「それら」は2つの単語になるように)、それらのケースを別々に処理するのが最善だと思います。たとえば、正規表現では問題が発生します。正しく処理する

they 're 'just friends'. Or that's what they say.

「're」と、最初の単語が左引用符で囲まれ、最後の単語が右引用符で囲まれた単語のシーケンスがありますが、最初の単語は既知のシーケンスではありません('s、're、'll、' d ...)アプリケーションレベルで処理できます。

于 2012-10-24T10:59:46.450 に答える
0

これはphpの問題ではなく、論理的な問題です。

単語は-で連結できます。略語は短い文のように見えるかもしれません。

この特定のフレーズにのみ適合するソリューションを作成することで、例に直接一致させることができます。しかし、考えられるすべてのフレーズの解決策を得ることができません。それには、ニューロンコンピューティングベースのコンテンツ認識が必要になります。

于 2012-10-24T10:51:15.763 に答える