\\ $DigitalSignature have full name value passed
$SignatureMatch = '/' . strtolower( $NameFirst . ' ' . $NameLast ) . '$/';
if( true == preg_match( $SignatureMatch, strtolower( $DigitalSignature ) ) )
{
$boolIsValid = true;
}
我有这个代码用于精确匹配名字和姓氏与数字签名匹配。但这会导致错误报告我生产(实时)的错误。
preg_match(): Unknown modifier 'b'
我无法重现此错误。我怎样才能首先得到这个错误。以及如何解决此错误以进行精确匹配。
我在SO上看过很多问题,但是什么时候会收到这个错误。我该如何解决这个问题。我见过的很多问题都是 -
答案 0 :(得分:4)
如果名字或姓氏包含/
,您的正则表达式将如下所示:
/john/doe$/
要preg_match
,这看起来像正则表达式是/john/
,尾随doe$/
是修饰符。那些当然是无效的修饰符。您需要使用preg_quote
在正则表达式本身内转义正则表达式分隔符(/
)。
答案 1 :(得分:3)
您输入的其中一个字符串($NameFirst
或$NameLast
)包含/
。使用不同的分隔符或将其转义为字符串。
此外,如果您只检查子字符串是否在其他字符串中,请不要使用preg_match
,请使用stripos()
,因为它会更快。
if (stripos($DigitalSignature ,"$NameFirst $NameLast")) { /* It exists! */ }
答案 2 :(得分:3)
$NameFirst
或$NameLast
可能包含斜杠/.
你应该替换这个
$SignatureMatch = '/' . strtolower( $NameFirst . ' ' . $NameLast ) . '$/';
由此:
$SignatureMatch = '/' . preg_quote(strtolower( $NameFirst . ' ' . $NameLast ), '/') . '$/';
答案 3 :(得分:0)
在这种情况下,您不应该使用正则表达式,因为您没有使用任何模式匹配。如果您只想在另一个字符串中找到一个字符串,请使用strpos
或strrpos
函数:http://php.net/manual/en/function.strpos.php
如果在签名末尾找到名称很重要,那么它就更容易了:从$ signature中获取一个子串,这个子串很长很多字符。
$fullname = strtolower( "$NameFirst $NameLast" );
$len = strlen($fullname);
$possible_name = substr( $fullname, -$len, $len );
$boolIsValid = ( $possible_name == $fullname );
答案 4 :(得分:0)
如果您使用的是T-Regx,定界符将自动为您添加:
$SignatureMatch = strtolower($NameFirst . ' ' . $NameLast) . '$';
if (pattern($SignatureMatch, 'i')->matches($DigitalSignature))
{
$boolIsValid = true;
}