用大写和小写字母匹配和替换单词的模式


Pattern to match and replace words with upper and also lower case in them

我遇到了从字符串中删除无意义单词的问题,例如:

$string="嗨,我叫Tom。jc2pMK NB,xVD NOZmF__u cYNdtR46eEb8y,74今天我注册了堆栈溢出。krEBNB1cB8 cq7,zCL x5KOwwRfU13.bI g_IXxlcztXYN,DPnmcgj2FyydHAx@我喜欢IT:0T1LAkuoPXscYC5uK6mlG R1nix_5kwF,EKxXvT1 SjZYC4A6YQ 4E";

现在,我希望能够在PHP中搜索并销毁那些毫无意义的单词。我尝试了preg_replace($pattern, "", $string),但无法找到让"嗨"留在那里但删除"jc2pMK"的模式。我敢打赌,这是一个包含字符串的基本过程,每个基本程序员都应该很容易理解,但我没有使用正则表达式的经验。

我对任何其他想法都持开放态度,如何摆脱无意义的词语。

如果你想在语义层面上解决这个问题,你需要一本字典。穷人的方法是做一些类似的事情

$dict = file('wordsEn.txt', FILE_IGNORE_NEW_LINES);
$string = "Hi, my name is Tom. jc2pMK NB,xVD NOZmF__u cYNdtR46eEb8y,74 Today i registered to stack overflow. krEBNB1cB8 cq7,zCL x5KOwwRZfU13.bI g_IXxlcztXYN , DPnmcgj2FyydHAx@ I like IT. 0T1LAkuoPXscYC5uK6mlG R1nix_5kwF ,EKxXvT1 SjZYC4A6YQ 4E";
$words = explode(' ', $string); // can also use str_word_count
echo implode (' ', array_intersect($words, $dict) );

这将把一个字典加载到一个数组中,把你的字符串拆分成一个数组,然后创建一个diff,给你字符串中也存在于字典中的单词。在这个例子中,我使用http://www-01.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt对于一本会导致以下结果的词典:

我的名字被注册为像一样堆叠

结果显然只会和你的字典一样好。此外,该解决方案没有将套管考虑在内。但它应该让你知道如何处理这个问题。

您可以在PHP的人类语言和字符编码支持中找到更复杂的解决方案,例如使用Enchant和PSpell扩展,可以根据字典文件拼写检查单词。

正如其他人所评论的,你没有定义什么是"无意义的词",所以不可能回答你的问题。但是,对于您的示例$string,一个仅适用于ONLY的正则表达式(不能保证适用于其他字符串)如下:

比赛(前面有空位):

 (?:'w+[0-9_,@](?:'.'w)?'w*|[0-9.,]'w*)

替换:

[leave empty]

您可以在regex101上进行在线测试。

以下是等效的PHP代码片段:

$output = "Hi, my name is Tom. jc2pMK NB,xVD NOZmF__u cYNdtR46eEb8y,74 Today i registered to stack overflow. krEBNB1cB8 cq7,zCL x5KOwwRZfU13.bI g_IXxlcztXYN , DPnmcgj2FyydHAx@ I like IT. 0T1LAkuoPXscYC5uK6mlG R1nix_5kwF ,EKxXvT1 SjZYC4A6YQ 4E";
$result = preg_replace('/ (?:'w+[0-9_,@](?:'.'w)?'w*|[0-9.,]'w*)/',"",$output);
echo $result; #prints Hi, my name is Tom. Today i registered to stack overflow. I like IT.

同样,对于您的特定字符串,这只是一个快速且肮脏的解决方案