PHP如何在匹配

时间:2018-01-31 03:56:06

标签: php regex

我正在使用打击代码来查看我的密码是否包含特殊字符,其工作正常。但我希望能够使用像$mySpecialChar这样的变量而不是"[\'^£$%&*()}{@#~?><>,|=_+¬-]"字符串,我不确定我是否可以这样做。原因是因为我希望能够从数据表中提取字符串。 我试过preg_match_all("/".$mySpecialChar."/"),但没有运气。

$matches = array();
if (preg_match_all("/[\'^£$%&*()}{@#~?><>,|=_+¬-]/", $pwd, $matches) > 0) {
    foreach ($matches[0] as $match) { $specialcase += strlen($match); }
}      

2 个答案:

答案 0 :(得分:0)

确保转义您在正则表达式中放置的任何变量

preg_match_all('/'.preg_quote($mySpecialChar, '/').'/', $pwd, $matches);

preg_quote

  

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-Z0-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中有多少条目,因为它会告诉您特殊字符的数量。