You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP正则匹配:允许多语言字母与单个减号,禁止首尾及重复减号

正则解决方案:精准匹配符合要求的字符串

当然有完美的正则解决方案!我们可以构建一个一次性满足你所有需求的表达式,替代你现在分开检查的临时方案,具体如下:

最终正则表达式

preg_match('/^[\p{L}]+(?:-[\p{L}]+)*$/', $post['firstname'])

正则各部分详解

让我们拆解一下这个表达式的逻辑,确保你理解它为什么能解决问题:

  • ^:锚定字符串的起始位置,确保我们从开头就开始匹配
  • [\p{L}]+:匹配一个或多个任意Unicode字母(\p{L}是Unicode字符类别,覆盖拉丁语、希伯来语、西里尔语等所有语言的字母,天然排除Unicode表情符号,因为表情不属于字母范畴)
  • (?:-[\p{L}]+)*:这是一个非捕获组,作用是匹配「减号+一个或多个字母」的组合,并且这个组合可以出现0次或多次:
    • -:匹配单个减号
    • [\p{L}]+:确保减号后面必须跟着至少一个字母,杜绝了连续减号的可能
    • *:允许这个组合出现0次(对应没有减号的纯字母字符串)或多次(对应多个带减号的分段)
  • $:锚定字符串的结束位置,确保字符串结尾不会是减号

验证你的示例场景

用这个正则测试你给出的例子,结果完全符合预期:

  • ✅ 匹配成功(符合要求):YaMo、Ya-Mo、Ya-Mo-Ga
  • ❌ 匹配失败(不符合要求):Ya--Mo(连续减号)、-Ya(开头是减号)、-Ya-Mo-(首尾都是减号)、Ya-(结尾是减号)、Yo-Mo- Mo(包含空格)、Yo-Mo -Go(空格后接减号)

对比你原来的正则

你之前使用的/^[\p{L} -]+$/存在几个关键问题:

  1. 允许空格存在,导致像Yo-Mo- Mo这类带空格的字符串被误判
  2. 没有限制减号的位置和连续出现的情况,所以--、开头/结尾减号都会被通过
    而新的正则直接从规则层面避免了这些问题,无需额外的substr或strpos检查。

内容的提问来源于stack exchange,提问作者nenad007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:47