如何在字符串中查找所有出现的单个字母组

时间:2016-02-06 11:12:03

标签: php regex preg-match-all

现在,大多数人在论坛或网络上的任何其他地方发帖,似乎都喜欢为每个字母添加一个随机字的空格。我知道甚至有一个名字,但我太累了,我不记得了。通常你会在帖子标题上看到这个。

所以我有一个项目,我将使用正则表达式来查找所有这些单个字母组以尝试连接它们,并希望将它们重新组合成一个单词。

现在我的大部分项目已经完成,但我总是陷入正则表达式,因为我只是没有得到它。我对大多数编程和逻辑的基础知识都很好,但正则表达式我仍然没有得到它们。

因此,如果有人可以帮助我使用以下正则表达式模式,我将非常感激。

当有人提交一些文字时我想做以下事情。查找由空格分隔且位于单词之间的3个或更多单个字母的任意组

$string = "Lorem i p s u m dolor sit a m e t, consectetur adipiscing e l i.";

// I know thats as far as I got with the pattern
$pattern = "/\s([a-zA-Z{1}])\s\w+/";

preg_match_all($pattern, $string, $matches);

所以上面的代码应输出:

Array 
(
   [0] => i p s u m
   [1] => a m e t
)

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

\b\p{L}(?:\h+\p{L}){2,}\b(?![\s\p{P}]*$)

请参阅regex demo

如果不在"句子的末尾,它将匹配至少3个用空格分隔的字母" (如果跟在字符串末尾有任何带标点符号的空格,则不匹配。)

IDEONE code demo

$re = '~\b\p{L}(?:\h+\p{L}){2,}\b(?![\s\p{P}]*$)~u'; 
$str = "Lorem i p s u m dolor sit a m e t, consectetur adipiscing e l i.";
preg_match_all($re, $str, $matches);
print_r($matches[0]);

正则表达式匹配:

  • \b - 领先的字边界
  • \p{L} - 一封信
  • (?:\h+\p{L}){2,} - 一个或多个水平空格(\h+)的两个或多个序列,后跟一个字母
  • \b - 尾随字边界
  • (?![\s\p{P}]*$) - 仅在字符串结尾前没有跟随零或更多空格或标点符号时匹配。

答案 1 :(得分:1)

您可以使用前瞻和重复,

/(?:\s[a-zA-Z](?=[\s,.])){3,}/

Regex Demo