我正在使用打击代码来查看我的密码是否包含特殊字符,其工作正常。但我希望能够使用像$mySpecialChar
这样的变量而不是"[\'^£$%&*()}{@#~?><>,|=_+¬-]"
字符串,我不确定我是否可以这样做。原因是因为我希望能够从数据表中提取字符串。
我试过preg_match_all("/".$mySpecialChar."/")
,但没有运气。
$matches = array();
if (preg_match_all("/[\'^£$%&*()}{@#~?><>,|=_+¬-]/", $pwd, $matches) > 0) {
foreach ($matches[0] as $match) { $specialcase += strlen($match); }
}
答案 0 :(得分:0)
确保转义您在正则表达式中放置的任何变量
preg_match_all('/'.preg_quote($mySpecialChar, '/').'/', $pwd, $matches);
string preg_quote(string $ str [,string $ delimiter = NULL])
preg_quote()接受str并在作为正则表达式语法一部分的每个字符前放置一个反斜杠。如果您有一个需要在某些文本中匹配的运行时字符串,并且该字符串可能包含特殊的正则表达式字符,这将非常有用。 特殊的正则表达式字符是:。 \ + *? [^] $(){} =! &LT; &GT; | : -
请注意/不是特殊的正则表达式字符。
你有5个或更多特殊字符。
值得注意的是上面引用的最后一行Note that / is not a special regular expression character.
虽然在你的情况下并不完全是必要的(我不会在你的变量字符串中看到/),如果你把第二个参数作为分隔符,它也会逃避。如果你密切关注我上面提到的内容,你会发现这正是我所做的,preg_quote($mySpecialChar, '/')
如果您不引用这些内容,那么任何人都可以猜测它会做什么。您可能会收到错误,您可以获得一个空的捕获组()
,您可以使用.
等匹配任何内容。如果您拥有它,
[\'^£$%&*()}{@#~?><>,|=_+¬-]
这是一个字符集,因此它会逃避其中的大部分内容,如果这是故意的话。如果您有[^\'£$%&*()}{@#~?><>,|=_+¬-]
,那么您将拥有一个非(或负数)字符集。
看到你正在使用preg_match_all
,而不是preg_match
,我可能会认为你不想要这个字符集。否则为什么要使用preg_match_all
如果你想匹配$mySpecialChar
中的所有内容,那应该就是这样:
preg_match('/['.preg_quote($mySpecialChar, '/').']+', $pwd, $matches);
如果你只是试图匹配[....]
之间的东西,我仍然会逃避它,因为它并不重要,但如果你把它放在一个数据库中并让它以{{1开头相反,它会产生影响,或者如果你在某些字符^
之间得到-
,例如它可能会产生影响。逃避永远不会伤害,只需在保存时删除0-9
并按照上面的说法更换它们。
[]
表示1或更多,[ .... ]+
表示无或更多。 [ ... ]*
表示一个或多个非gready等等。然后你应该只使用[...]+
?
和preg_match,这样就可以使用[...]+
匹配一个与preg_match_all进行更清晰的匹配。
大部分时间[...]
(大写)也会匹配大多数符号,基本上这意味着\W
或不[^a-zA-Z0-9_]
,a-Z
和0-9
答案 1 :(得分:0)
你总能找到不是基本字符的字符:
preg_match_all('/[^0-9A-Za-z]/', $pwd, $matches)
更短,更有效。
如果您愿意,可以轻松地将其放入字符串中:
$specialChars = '[^0-9A-Za-z]';
preg_match_all("/{$specialChars}/", $pwd, $matches);
在提供的密码上运行此命令将在$matches
中返回一个数组,其中包含字符串中的所有特殊字符。为了评估密码复杂性,您需要做的就是查看$pwd
的长度以及$matches
中有多少条目,因为它会告诉您特殊字符的数量。