Когда возникает preg_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. Предупреждение: preg_match() [function.preg-match]: неизвестный модификатор< /а>
  2. Неизвестный модификатор в операторе preg_match()
  3. Предупреждение: preg_match() [function.preg-match]: неизвестный модификатор< /а>
  4. Неизвестная ошибка модификатора 'l'
  5. Неизвестный модификатор 'g' Ошибка регулярного выражения PHP
  6. Неизвестный модификатор '/' в...? что это?
  7. preg_match() Неизвестный модификатор '[' help
  8. Предупреждение: preg_match() [function.preg-match]: неизвестно модификатор 'v'
  9. PHP Preg_match соответствует точному слову
  10. Неизвестный модификатор 'v' при использовании выражения preg_match() в регулярное выражение
  11. preg_match(); - Неизвестный модификатор '+'
  12. preg_match error Неизвестный модификатор '{'
  13. Неизвестный модификатор '(' при использовании preg_match() с REGEX-выражение

person Somnath Muluk    schedule 03.08.2012    source источник
comment
Нам нужно увидеть результирующий шаблон, а не переменные, которые его создают.   -  person Mitya    schedule 03.08.2012


Ответы (5)


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

/john/doe$/

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

person deceze♦    schedule 03.08.2012

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

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

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

Этим :

$SignatureMatch =  '/' . preg_quote(strtolower( $NameFirst . ' ' . $NameLast ), '/') . '$/';
person Oussama Jilal    schedule 03.08.2012

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

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

if (stripos($DigitalSignature ,"$NameFirst $NameLast")) { /* It exists! */ }
person Madara's Ghost    schedule 03.08.2012
comment
Я удаляю косые черты из $DigitalSignature перед тем, как перейти к проверке. - person Somnath Muluk; 03.08.2012
comment
@SomnathMuluk: я не имел в виду $DigitalSignature. - person Madara's Ghost; 03.08.2012
comment
Спасибо. Наконец-то я могу воспроизвести эту ошибку. Мне нужно точное совпадение. Возможно ли это со стриптизершей? - person Somnath Muluk; 03.08.2012
comment
@SomnathMuluk: если вам требуется точное совпадение, используйте знак равенства ==. Если вам нужно проверить, что подпись содержит имя и фамилию, используйте stripos(). - person Madara's Ghost; 03.08.2012

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

Если вы использовали T-Regx, разделители будут добавлены автоматически:

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

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