为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PHP 从字符串中删除标点符号但不在收缩内

使用 PHP 从字符串中删除标点符号但不在收缩内

PHP
达令说 2021-06-30 06:27:41
我正在编写将文本分解成单词并执行诸如计算单词大小之类的代码。我想出了这个(经过一些搜索):$text = preg_replace("/[^[:alnum:][:space:]]/u", ' ', $text);$words = mb_split( ' +', $text );但是,收缩不起作用,因为撇号和单引号看起来相同(因为它们是)。我需要一种方法来分离单词但包括收缩。目前,我已经包含了所有我能想到的停用词的缩写,但这是最不令人满意的。我不擅长正则表达式,需要一些建议。尽管我发布了自己的不雅解决方案,但我将这个问题悬而未决,希望能得到更完美的答案。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我已经在这方面工作了一段时间。评论和 Taha Paksu 非常有效的解决方案有助于帮助我思考问题。除了重音字母之外,Taha Paksu 的解决方案完全隔离了单词。谷歌搜索似乎表明 RegEx 对非 ascii 字符不太友好。


正是当我放弃尝试做正则表达式伏都教(任何可以得到我最深切尊重的人)时,我才想到了这个不太优雅的 hack。


$text = "Testing text. Café is spelled true. And pokémon too... ‘bad quotes’. (brackets)... Löwen, Bären, Vögel und Käfer sind Tiere. That’s what I said.";

$text = str_replace(array('’',"'"), '000AP000', $text);

$text = str_replace("-", '000HY000', $text);

$text = preg_replace("/[^[:alnum:][:space:]]/u", ' ', $text);

$text = str_replace('000AP000', "'", $text);

$text = str_replace('000HY000', "-", $text);

$text = str_replace(array("' ",'- ','  '," '",' -','  '), ' ', $text);

$words = mb_split( ' +', $text );

它使用两个统计上不太可能的字符串作为占位符,清理其余的字符串,将连字符和撇号放回原处,然后取出任何接触空格(和多个空格)的东西。它适用于我能找到的所有东西。


如果可以,我想找到一个不那么繁琐的解决方案,但我的正则表达式技能可能无法胜任这项任务(即使打开了备忘单)。


查看完整回答
反对 回复 2021-07-02
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信