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

3
\\    $DigitalSignature have full name value passed
$SignatureMatch =  '/' . strtolower( $NameFirst . ' ' . $NameLast ) . '$/';
if( true == preg_match( $SignatureMatch, strtolower( $DigitalSignature ) ) )
{
    $boolIsValid = true;
}

我有一个用于精确匹配名字和姓氏并添加数字签名的代码。但是在生产环境(正式环境)中,这段代码报错并记录在错误日志里。请帮忙检查一下。
preg_match(): Unknown modifier 'b'

我无法重现这个错误。首先,我该如何获得这个错误?并且如何解决这个确切匹配的错误。

我在Stack Overflow上看到了很多问题,但是不知道什么时候会出现这个错误。以及如何解决它。以下是其中一些问题 -

  1. 警告:preg_match() [function.preg-match]:未知修饰符
  2. preg_match()语句中的未知修饰符
  3. 警告:preg_match() [function.preg-match]:未知修饰符
  4. 未知修饰符'l'错误
  5. 未知修饰符'g' PHP正则表达式错误
  6. 未知修饰符'/' in ...? 这是什么?
  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. 使用REGEX表达式的preg_match()时出现未知修饰符'('

1
我们需要看到生成该模式的结果,而不是创建它的变量。 - Mitya
5个回答

5
如果名字中包含/,则正则表达式应该如下所示:
/john/doe$/

对于 preg_match 函数而言,这个正则表达式看起来像是 /john/,最后的 doe$/ 是修饰符。当然,这些都是无效的修饰符。你需要在正则表达式内部使用 preg_quote 来转义正则表达式定界符 (/)。

4

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

你应该替换这个

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

通过此:

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

3

你输入的字符串之一 ($NameFirst$NameLast) 包含了一个/。请使用其他分隔符或在这些字符串中转义它。

另外,如果你只是检查一个子字符串是否包含在另一个字符串中,请不要使用preg_match,而应该使用stripos(),因为它会更快。

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

在传递给检查之前,我会从$DigitalSignature中删除斜杠。 - Somnath Muluk
@SomnathMuluk:我不是指 $DigitalSignature - Madara's Ghost
谢谢。我终于成功复现了这个错误。我需要精确匹配。使用stripos能实现吗? - Somnath Muluk
如果您需要精确匹配,请使用等号“==”。如果您需要检查签名是否包含名字和姓氏,请使用“stripos()”。@SomnathMuluk - Madara's Ghost

0

如果您正在使用T-Regx,分隔符将自动为您添加:

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

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

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 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接