preg_match():何时出现未知修饰符错误


When does preg_match(): Unknown modifier error occur?

''    $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的问题,但不明白什么时候会出现此错误。我该如何解决这个问题。在我看到的众多问题中,有一些问题是——

  1. 警告:preg_match(( [function.preg-match]:未知修饰符
  2. preg_match(( 语句中的未知修饰符
  3. 警告:preg_match(( [function.preg-match]:未知修饰符
  4. 未知修饰符"l"错误
  5. 未知修饰符 'g' PHP 正则表达式错误
  6. ...中的未知修饰符"/"? 这是什么?
  7. preg_match(( 未知修饰符 '[' 帮助
  8. 警告:preg_match(( [function.preg-match]:未知修饰符"v">
  9. PHP Preg_match匹配确切的单词
  10. 在正则表达式中使用 preg_match(( 表达式时的未知修饰符"v">
  11. preg_match((; - 未知修饰符"+">
  12. preg_match错误未知修饰符"{">
  13. 将 preg_match(( 与 REGEX 表达式一起使用时出现未知修饰符 '('

如果名字或姓氏包含/,您的正则表达式将如下所示:

/john/doe$/

preg_match来说,这看起来像正则表达式是/john/的,尾随doe$/是修饰符。这些当然是无效的修饰符。您需要使用 preg_quote 转义正则表达式本身内部的正则表达式分隔符 ( / (。

$NameFirst$NameLast可能包含斜杠/。

你应该替换这个

$SignatureMatch =  '/' . strtolower( $NameFirst . ' ' . $NameLast ) . '$/';

通过这个:

$SignatureMatch =  '/' . preg_quote(strtolower( $NameFirst . ' ' . $NameLast ), '/') . '$/';

您输入的字符串之一($NameFirst$NameLast(包含/。使用不同的分隔符或在字符串中对其进行转义。

此外,如果您只检查子字符串是否在不同的字符串中,请不要使用 preg_match ,使用 stripos() 因为它会快得多。

if (stripos($DigitalSignature ,"$NameFirst $NameLast")) { /* It exists! */ }

在这种情况下,不应使用正则表达式,因为您没有使用任何模式匹配。 如果您只想在另一个字符串中找到一个字符串,请使用 strposstrrpos 函数: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 );

如果您使用的是 T-Regx,则会自动为您添加分隔符:

$SignatureMatch =  strtolower($NameFirst . ' ' . $NameLast) . '$';
if (pattern($SignatureMatch, 'i')->matches($DigitalSignature))
{
    $boolIsValid = true;
}