在 PHP 中拆分非字母数字字符串?用php自带的函数可以吗?

问题描述 投票:0回答:4

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

示例:

$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 本机函数或其他我们不依赖的方式来完成此操作?

问候

php regex split native pcre
4个回答
3
投票

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


3
投票

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

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

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

如果您想根据上下文不同地处理标点符号(例如,如果后面跟有空格,则使点仅作为分隔符),您也可以这样做:

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

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 ... )可以在应用程序级别处理。


0
投票

这不是一个 php 问题,而是一个逻辑问题。

单词可以用 - 连接。缩写可能看起来像短句子。

您可以通过创建仅适合该特定短语的解决方案来直接匹配您的示例。但你无法得到所有可能的短语的解决方案。这需要基于神经元计算的内容识别。

© www.soinside.com 2019 - 2024. All rights reserved.