我试图用非字母数字字符拆分字符串,或者简单地说我想拆分单词。我立即想到的方法是使用正则表达式。
示例:
$string = 'php_php-php php';
$splitArr = preg_split('/[^a-z0-9]/i', $string);
但是我发现这种方法有两个问题。
$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}]
所以我的问题是:
问候
听起来像是 str_word_count() 的情况,使用经常被遗忘的 1 或 2 值作为第二个参数,第三个参数包括连字符、句号和撇号(或任何您希望视为单词部分的其他字符) ) 作为单词的一部分;接下来是 array_walk() trim 这些字符从结果数组值的开头或结尾,因此只有当它们实际嵌入到“单词”中时才包含它们
要么安装了 PHP(然后还安装了 PCRE),要么没有安装。所以你的第一点不是问题。
然后,如果您想从分割分隔符中排除标点符号,您需要将它们添加到您的字符类中:
preg_split('/[^a-z0-9.\']+/i', $string);
如果您想根据上下文不同地处理标点符号(例如,如果后面跟有空格,则使点仅作为分隔符),您也可以这样做:
preg_split('/\.\s+|[^a-z0-9.\']+/i', $string);
根据我的评论,您可能想尝试(根据需要添加尽可能多的分隔符)
$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 ... )可以在应用程序级别处理。
这不是一个 php 问题,而是一个逻辑问题。
单词可以用 - 连接。缩写可能看起来像短句子。
您可以通过创建仅适合该特定短语的解决方案来直接匹配您的示例。但你无法得到所有可能的短语的解决方案。这需要基于神经元计算的内容识别。