首页 > 解决方案 > 使用 PHP 正则表达式的字符集中至少出现两次或多次

问题描述

我想制作 PHP 正则表达式来查找文本是否在字符集 {-, l, s, i, a} 中有两个或多个至少一个字符。我是这样做的。

preg_match("/[-lisa]{2,}/", $text);

但这不起作用。请帮我。

标签: phpregex

解决方案


匹配两个或多个匹配项意味着匹配两个就足以使检查有效。

字符集中至少有一个可能意味着您想要匹配集中的相同字符或匹配集中的任何字符两次。如果你想要前者,当相同的字符重复时,你可以使用preg_match('~([-lisa]).*?\1~', $string, $match)注意单引号分隔字符串文字,如果你使用双引号,反向引用必须有双反斜杠),如果是后者,即你想匹配..l...i..,你可以使用preg_match('~[-lisa].*?[-lisa]~', $string, $match)preg_match('~([-lisa]).*?(?1)~', $string, $match)(其中(?1)是重复相应组模式的正则表达式子例程)。

如果您的字符串包含换行符,请不要忘记添加s修饰符preg_match('~([-lisa]).*?\1~s', $string, $match).

不仅如此,如果你想检查连续字符重复,你应该.*从上面的模式中删除,即 1) must bepreg_match('~([-lisa])\1~', $string, $match)和 2) must be preg_match('~[-lisa]{2}~', $string, $match)(虽然,这不是你想要的,根据你自己的反馈来判断,所以这个例子这里只是为了记录)。

([-lisa])\1{2}您发现有用的模式与重复 -的 、l、或char 匹配三次(i、、等) ,因此只有在符合您的要求时才使用它。sa---lllsss

请注意,preg_match函数会在字符串内的任何位置搜索匹配项,并且不需要完整的字符串匹配项(因此,无需在模式的开头和结尾添加.*(或^.*, ))。.*$

查看示例正则表达式演示,随时在此环境中测试您的字符串。


推荐阅读