如何修改PHP正则表达式以禁止字符串中出现连续点序列?
修改正则表达式以禁止连续点序列
嘿,要解决这个问题其实很简单,我们只需要在你原有的正则基础上,添加一个负向前瞻断言来排除包含连续点的情况就行。
方案一:直接用负向前瞻禁止连续点
这个方案最直观,既保留了你原来允许的所有合法字符,又能直接过滤掉任何包含..(连续两个点)的字符串。
修改后的验证代码如下:
if (!empty($value) && !preg_match("/^(?!.*\.\.)[A-Za-zÀ-ÖØ-öø-ÿĀ-ž\s\'\.\-]+$/", $value)) { echo "KO"; } else { echo "OK"; }
正则解释:
(?!.*\.\.):这是核心的负向前瞻断言,意思是整个字符串中不存在任何位置后面跟着两个连续的点。不管连续点在开头、中间还是结尾,都会被直接排除。- 后面的
[A-Za-zÀ-ÖØ-öø-ÿĀ-ž\s\'\.\-]+就是你原来的规则,允许字母、重音字符、空格、单引号、单个点和连字符。
测试案例
- ✅ 合法输入(输出OK):
"test.example"、"test'example-test"、"Hello-Wörld." - ❌ 非法输入(输出KO):
"tes....t"、"...example"、"test..example"
进阶:禁止开头/结尾出现单个点(可选)
如果你还想进一步限制,不允许字符串以点开头或结尾,可以用下面的正则:
if (!empty($value) && !preg_match("/^(?!.*\.\.)[A-Za-zÀ-ÖØ-öø-ÿĀ-ž\s\'\-]+(?:\.[A-Za-zÀ-ÖØ-öø-ÿĀ-ž\s\'\-]+)*$/", $value)) { echo "KO"; } else { echo "OK"; }
这个正则会确保点只能出现在字符串中间,且前后都有合法的非点字符,同时依然禁止连续点。
内容的提问来源于stack exchange,提问作者hbgamra
相关产品推荐
相关产品推荐

