Мой regex правильно не принимает строку в сети, но preg_match () возвращает true - PullRequest
1 голос
/ 15 февраля 2020

У меня есть это регулярное выражение /^(string@)([^#\s\\\\]|(\\\d{3}))*$/.

Предполагается, что он может принимать строки, которые начинаются с string@, затем могут следовать все символы, кроме #, \ или любые пробельные символы. \ может появиться, только если за ним следуют 3 цифры.

Когда я проверяю это регулярное выражение со строкой string@test\07test на regex101.com и phpliveregex.com, совпадений не найдено (правильно), но preg_match() возвращает true для той же строки.

Что я делаю не так?

Спасибо

ОБНОВЛЕНИЕ:

$regex = "/^(string@)([^#\s\\\\]|(\\\d{3}))*$/";

preg_match($regex, 'string@test\07test'); # this returns false, as it should

preg_match($regex, "string@test\07test"); # this returns true

Тестовая строка берется из файла с использованием fgets() и сохраняется в переменной, хотя, поэтому я не могу передать ее в preg_match() и поставить апострофы вокруг нее, мне нужно передать переменную ($ string, например), и preg_match($regex, $string) снова неверно возвращает true.

1 Ответ

2 голосов
/ 15 февраля 2020

Перво-наперво:

'\07' - это строка длиной 3, начинающаяся с символа backsla sh.

"\07" - это строка длины 1, состоящая из ASCII x '07'

Interactive shell

php > echo strlen('\07');
3
php > echo strlen("\07");
1
php >

См. PHP Строки

Регулярное выражение:

/^string@(?:[^#\s\\]|\\(?=\d{3}))*$/

См. Демонстрационное выражение Regex

  1. ^ Соответствует началу строки.
  2. string@ Соответствует string@.
  3. [^#\s\\] Соответствует любому символу, кроме #, пробела или \.
  4. | или
  5. \\(?=\d{3}) Соответствует \, если следуют 3 цифры.
  6. (?: expression 3 through 5)* соответствует 0 или более раз.
  7. $ Соответствует концу строки.

Код:

<?php
$tests = [
    'abcd',
    'string@ test',
    'string@#test',
    'string@\07test',
    'string@\075test',
    'string@test'
];

$regex = '/^string@(?:[^#\s\\\\]|\\\\(?=\d{3}))*$/';
foreach ($tests as $test) {
    if (preg_match($regex, $test)) {
        echo "$test\n";
    }
}

Печать:

string@\075test
string@test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...