Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将正则表达式与字符串alnums和连字符进行匹配,但哪一个不匹配';不要以连字符开头或结尾?_Php_Regex_String_Pcre_Assertions - Fatal编程技术网

Php 如何将正则表达式与字符串alnums和连字符进行匹配,但哪一个不匹配';不要以连字符开头或结尾?

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!" 也就是说,我首先检查字符串的内容是否正确,是否以“-”结

我有一些代码验证一个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!"
也就是说,我首先检查字符串的内容是否正确,是否以“-”结尾,长度是否正确,然后我运行另一个测试,以查看它是否以“-”结尾

有没有关于将其合并到单个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查找断言后面的内容或查找所有断言。在这种情况下,最好知道另一种方法。是的,我知道这一点,这就是我使用它的原因:)