Когда выполняется preg_match (): Неизвестная ошибка модификатора?

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

У меня есть этот код для точного совпадения имени и фамилии с цифровой подписью. Но это дает сообщение об ошибке в журнале ошибок (live).

 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 regex
  6. Неизвестный модификатор '/' in …? что это?
  7. preg_match () Неизвестный модификатор '[' help
  8. Предупреждение: preg_match () [function.preg-match]: Неизвестный модификатор 'v'
  9. PHP Preg_match соответствует точному слову
  10. Неизвестный модификатор 'v' при использовании выражения preg_match () в regex
  11. preg_match (); – Неизвестный модификатор '+'
  12. preg_match error Неизвестный модификатор '{'
  13. Неизвестный модификатор '(' при использовании preg_match () с выражением REGEX

Если имя или фамилия содержит / , ваше регулярное выражение будет выглядеть примерно так:

 /john/doe$/ 

Для preg_match это выглядит как regex is /john/ , при этом конечные doe$/ являются модификаторами. Это, конечно, недействительные модификаторы. Вам нужно избегать разделителей регулярных выражений ( / ) внутри самого регулярного выражения, используя preg_quote .

Одна из строк, которые вы вводите ( $NameFirst или $NameLast ), содержит / . Используйте другой разделитель или избегайте его в строках.

Кроме того, если вы проверяете, находится ли подстрока внутри другой строки, не используйте preg_match , используйте stripos() поскольку она будет намного быстрее.

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

$NameFirst или $NameLast может содержать косую черту /.

Вы должны заменить это

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

Этим :

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

Вы не должны использовать регулярное выражение в этом случае, потому что вы не используете сопоставление шаблонов. Если вы просто хотите найти одну строку внутри другой, используйте функции 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 );