regex 在PHP中拆分非字符串?可以用php的原生函数吗?

bqf10yzr  于 2023-11-20  发布在  PHP
关注(0)|答案(4)|浏览(149)

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

示例:

第一个月
但我认为这种方法存在两个问题。
1.它不是一个原生的php函数,并且完全依赖于服务器上运行的PCRE库。
1.一个同样重要的问题是,如果我在一个单词中有标点符号怎么办

示例:

$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的原生函数或者其他不依赖的方法来实现?

问候

drnojrws

drnojrws1#

听起来像是str_word_count()使用经常被遗忘的1或2值作为第二个参数,并使用第三个参数来包括连字符,句号和撇号(或任何其他字符,你想作为词的一部分对待)作为一个词的一部分;后跟array_walk()trim这些字符从结果数组值的开始或结束,所以只有当它们真正嵌入到“单词”中时,

lmyy7pcs

lmyy7pcs2#

要么你安装了PHP(然后你也安装了PCRE),要么你没有。所以你的第一点是没有问题的。
然后,如果你想从分割分隔符中排除标点符号,你需要将它们添加到字符类中:

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

字符串
如果你想根据上下文对标点符号进行不同的处理(比如,如果后面跟着空格,那么一个点只能是一个空格),你也可以这样做:

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

aij0ehis

aij0ehis3#

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

$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 ...),可以在应用级处理。

zyfwsgd6

zyfwsgd64#

这不是一个php问题,而是一个逻辑问题。
单词可以用-连接起来,缩写可以看起来像短句。
你可以通过创建一个只适合这个特定短语的解决方案来直接匹配你的例子。但是你不能为所有可能的短语找到一个解决方案。这需要一个基于神经计算的内容识别。

相关问题