1

我试图在非字母数字字符上拆分字符串,或者简单地说我想拆分单词。我立即想到的方法是使用正则表达式。

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

但是我发现这种方法存在两个问题。

  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

听起来像是str_word_count()的情况,第二个参数使用经常被遗忘的 1 或 2 值,第三个参数包括连字符、句号和撇号(或您希望视为单词部分的任何其他字符)作为一部分一个词;后跟一个array_walk()从结果数组值的开头或结尾修剪这些字符,因此只有在它们实际嵌入“单词”时才包含它们

于 2012-10-24T10:58:28.517 回答
3

要么你安装了 PHP(然后你也有 PCRE),要么你没有。所以你的第一点不是问题。

然后,如果您想从拆分分隔符中排除标点符号,您需要将它们添加到您的字符类中:

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

如果您想根据上下文以不同的方式处理标点字符(例如,如果后跟空格,则仅将点作为分隔符),您也可以这样做:

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

根据我的评论,您可能想尝试(根据需要添加尽可能多的分隔符)

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

然后,您必须处理“引用”单词的情况(在正则表达式中做到这一点并不容易,因为 'is" "this' 引用了?以及如何?)。

所以我认为最好将 ' 和 " 保留在单词中(这样 "it's" 是一个单词,而 "they 'll" 是两个单词),然后分别处理这些情况。例如,正则表达式会遇到一些麻烦正确处理

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 回答