Regex验证第一个和最后一个字符


Regex to verify first and last character

我需要在php中验证字符串不应该以连字符(-)开头或结尾。允许的字符是a-zA-Z0-9和字符串中间任意位置的连字符。

我的这个正则表达式

/^[a-zA-Z0-9-]+$/

验证允许的字符是否出现,条件是字符串不应以连字符开头或结尾。我该如何做到这一点?我是regex的新手。

这应该是您所需要的。

/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/iD

请注意D修饰符。如果没有它,表达式将匹配以新行结束的字符串。请参见此处:http://blog.5ubliminal.com/posts/surprises-of-php-regexp-the-d-modifier/.此外,我已经使用了i修饰符来不必使用[a-zA-Z0-9]。使表达式保持较短。

这里有几个例子。当输入字符串在新行中结束时,它应该会失败,但如果没有D修饰符,即使有$锚点,它也会通过:

// Outputs: int(1)
var_dump(preg_match('/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/i', "aBc-d'n"));
// Outputs: int(0)
var_dump(preg_match('/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/iD', "aBc-d'n"));

使用消极的前瞻性和前瞻性来实现这个

^(?!-)[a-zA-Z0-9-]+(?<!-)$

在Regexr 上查看

^(?!-)是一个否定的前瞻性断言,确保它不会以短划线开头

(?<!-)$是一个否定的后备断言,确保它不会以短划线结束

查找的优点是,它们与字符不匹配,而只是定义一个断言,这意味着字符串的长度也可以为1,其中明确要求非短划线作为第一个和最后一个字符的解决方案的最小长度为2。

Btw。a-zA-Z0-9_是一个预定义的类'w,所以如果你也想允许下划线,你可以改为:

^(?!-)['w-]+(?<!-)$

试试这个:

/^[a-zA-Z0-9_]+[a-zA-Z0-9_-]*[a-zA-Z0-9_]+$/

"一个或一个除连字符外的任何东西,然后是包括连字符在内的任何数量的东西,然后一个或多个除连字符串外的任何事物"。

EDIT:如果字符串长度为一个字符,则此操作将失败。很抱歉。但你明白了。。。将其拆分为子正则表达式。

验证允许的字符是否出现,条件是字符串不应以连字符开头或结尾。我该如何做到这一点?我是regex的新手。

简单地说:~^[^-][a-z0-9-]+[^-]$~应该匹配。它说第一个字符不能是-,然后说中间部分只能包含[a-z0-9],然后说最后一个字符不能为'-'。也就是说,你也可以用substr来做这件事,我认为你实际上不需要正则表达式。

带子字符串:

<?php
$valid = ((substr($str, 0, 1) != '-') && (substr($str, -1) != '-'));

EDIT:没有阅读字母数字加连字符部分,将其包含在正则表达式中。

使用substr方法。类似于:

if ((substr($str, 0, 1) != '-') && (substr($str, strlen($str)) != '-')){

它可能还有一个类似于javascript中charAt的函数,但我现在不记得了。(这将使您获得更可读的代码)

这本身不是一个正则表达式,但可以根据您的要求工作:

if(
   ctype_alnum($str[0]) && 
   ctype_alnum($str[strlen($str)-1]) && 
   strpos(substr($str, 1, strlen($str-1)), '-') !== false
) {
   echo 'a match';
}