什么时候preg_match():发生未知修饰符错误?

时间:2012-08-03 10:41:49

标签: php regex preg-match exact-match

\\    $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. Warning: preg_match() [function.preg-match]: Unknown modifier
  2. Unknown modifier in preg_match() statement
  3. Warning: preg_match() [function.preg-match]: Unknown modifier
  4. Unknown modifier 'l' error
  5. Unknown modifier 'g' PHP regex error
  6. Unknown modifier '/' in ...? what is it?
  7. preg_match() Unknown modifier '[' help
  8. Warning: preg_match() [function.preg-match]: Unknown modifier 'v'
  9. PHP Preg_match match exact word
  10. Unknown modifier 'v' when using preg_match() expression in regex
  11. preg_match(); - Unknown modifier '+'
  12. preg_match error Unknown modifier '{'
  13. Unknown modifier '(' when using preg_match() with a REGEX expression

5 个答案:

答案 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)

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

答案 4 :(得分:0)

如果您使用的是T-Regx,定界符将自动为您添加:

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

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