Php 如何将正则表达式与字符串alnums和连字符进行匹配,但哪一个不匹配';不要以连字符开头或结尾?
我有一些代码验证一个1到32个字符的字符串,该字符串可能只包含字母数字和连字符('-'),但不能以连字符开头或结尾 我使用的是PCRE正则表达式&PHP(尽管在本例中PHP部分并不重要) 现在,伪代码如下所示:Php 如何将正则表达式与字符串alnums和连字符进行匹配,但哪一个不匹配';不要以连字符开头或结尾?,php,regex,string,pcre,assertions,Php,Regex,String,Pcre,Assertions,我有一些代码验证一个1到32个字符的字符串,该字符串可能只包含字母数字和连字符('-'),但不能以连字符开头或结尾 我使用的是PCRE正则表达式&PHP(尽管在本例中PHP部分并不重要) 现在,伪代码如下所示: if (match("/^[\p{L}0-9][\p{L}0-9-]{0,31}$/u", string) and not match("/-$/", string)) print "success!" 也就是说,我首先检查字符串的内容是否正确,是否以“-”结
if (match("/^[\p{L}0-9][\p{L}0-9-]{0,31}$/u", string)
and
not match("/-$/", string))
print "success!"
也就是说,我首先检查字符串的内容是否正确,是否以“-”结尾,长度是否正确,然后我运行另一个测试,以查看它是否以“-”结尾
有没有关于将其合并到单个PCRE正则表达式的建议
我已尝试使用“向前看/向后看”断言,但无法使其正常工作。尝试以下正则表达式:
/^[\p{L}0-9](?:[\p{L}0-9-]{0,30}[\p{L}0-9])?$/u
如果要使用环视断言:
/^[\p{L}0-9][\p{L}0-9-]{0,31}$(?<!-)/u
/^[\p{L}0-9][\p{L}0-9-]{0,31}$(?一种稍微有点不同的方法是将您的角色类保持在一个整体中,并具体说明不允许连字符的点
/^(?!-)[\p{L}0-9-]{1,32}(?<!-)$/Du
/^(?)[\p{L}0-9-]{1,32}(?)?
还要注意大家似乎总是忘记的D
修饰符
最后,为了确定,您知道\pL
将比a-zA-Z
匹配更多,对吗?只是检查一下。第一个建议很好,似乎通过了我所有的测试,谢谢!顺便问一下,您知道是否有任何理由喜欢其中一个而不是另一个吗?@Shahar Evron:有一些正则表达式实现不支持rt查找断言后面的内容或查找所有断言。在这种情况下,最好知道另一种方法。是的,我知道这一点,这就是我使用它的原因:)