在PHP中的非字母数字上拆分字符串?是否可以使用php的原生功能?

时间:2012-10-24 10:44:45

标签: php regex split native pcre

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

示例:
$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}]
  3. 所以我的问题是:

    • 我们如何根据文字拆分它们?
    • 是否有可能使用php本机功能或其他我们不依赖的方式?

    此致

4 个答案:

答案 0 :(得分:3)

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

然后,如果要从分割分隔符中排除标点符号,则需要将它们添加到角色类中:

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

如果你想根据上下文不同地处理标点字符(例如,如果后跟空格,则只做一个点作为分隔符),你也可以这样做:

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

答案 1 :(得分:2)

听起来像str_word_count()使用经常被遗忘的1或2值作为第二个参数的情况,并且第三个参数包含连字符,句号和撇号(或者您想要作为单词处理的任何其他字符) - 部分)作为一个词的一部分;然后是结果数组值开头或结尾的array_walk()trim个字符,因此只有当它们实际嵌入"字时才会包含它们。

答案 2 :(得分:1)

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

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

然后你必须处理一个“引用”字的情况(在正则表达式中这并不容易,因为'是'“这个'引用了?以及如何?)。

所以我认为最好将'和'保持在单词之内(这样“它就是”单个单词,而“它们就是两个单词”)然后分别处理这些情况。例如正则表达式会有正确处理方面有些麻烦

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

虽然有“'re”和一系列单词,其中第一个是左引用而最后一个是右引,第一个不是已知序列('s,'re,'ll,'d。 ..)可以在应用程序级别处理。

答案 3 :(得分:0)

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

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

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