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

时间:2013-12-01 17:02:06

标签: php regex preg-replace expression

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

  

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

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

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

2 个答案:

答案 0 :(得分:2)

如果你想在语义层面上解决这个问题,你需要一种某种字典。一个穷人的方法就是做一些像

这样的事情
$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's Human Language and Character Encoding Support中找到更复杂的解决方案,例如使用EnchantPSpell扩展程序,这些扩展程序允许您对字典文件进行拼写检查。

答案 1 :(得分:1)

正如其他人所评论的那样,你没有定义什么是“毫无意义的词”,所以你不可能回答你的问题。但是,对于您的示例$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.

同样,这只是您特定字符串的快速而肮脏的解决方案