Php preg_match необязательная группа - PullRequest
0 голосов
/ 10 июля 2019

Я написал регулярное выражение:

(^.*)(\[{1}[0-9]+:[0-9]+:[0-9]+:[0-9]+\]{1}) (\"{1}.+\"{1}) ([0-9]+) ([0-9-]+)

, чтобы соответствовать строке вроде:

141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233

и используя php preg_match.

Когда я удаляю из строкинапример, в первой части 141.243.1.172 preg_match возвращает меня:

array(6
 0  =>  [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
 1  =>  // correctly empty
 2  =>  [29:23:53:25]
 3  =>  "GET /Software.html HTTP/1.0"
 4  =>  200
 5  =>  233
 )

, где индекс 1 правильно пуст.Но если я удаляю из строки [29: 23: 53: 25], я получаю пустой массив из preg_match.Как получить тот же результат, что и выше, получить пустой связанный индекс и не все?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Для первой части, которая работает из-за .*.Если вы хотите иметь возможность удалить и вторую часть, вы можете сделать обе группы необязательными, а первую - не жадной.Переместите пробел также во вторую группу.

Обратите внимание, что вам не нужно избегать двойной кавычки и что квантификатор {1} является лишним, поэтому его можно опустить.

Тамтолько одна двойная кавычка, следующая после первого совпадения, но для предотвращения возможного избыточного совпадения вы можете сделать это совпадение не жадным или использовать вместо него класс отрицательных символов ("[^"]+"), чтобы избежать ненужного возврата.

(^.*?)?(\[[0-9]+:[0-9]+:[0-9]+:[0-9]+\] )?(".+?") ([0-9]+) ([0-9-]+)

Regex demo

Например

$strings = [
    '141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233',
    '[29:23:53:25] "GET /Software.html HTTP/1.0" 200 233',
    '"GET /Software.html HTTP/1.0" 200 233'
];

$pattern = '/(^.*?)?(\[[0-9]+:[0-9]+:[0-9]+:[0-9]+\] )?(".+?") ([0-9]+) ([0-9-]+)/';

foreach ($strings as $string) {
    preg_match($pattern, $string, $matches);
    print_r($matches);
}

Результат

Array
(
    [0] => 141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
    [1] => 141.243.1.172 
    [2] => [29:23:53:25] 
    [3] => "GET /Software.html HTTP/1.0"
    [4] => 200
    [5] => 233
)
Array
(
    [0] => [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
    [1] => 
    [2] => [29:23:53:25] 
    [3] => "GET /Software.html HTTP/1.0"
    [4] => 200
    [5] => 233
)
Array
(
    [0] => "GET /Software.html HTTP/1.0" 200 233
    [1] => 
    [2] => 
    [3] => "GET /Software.html HTTP/1.0"
    [4] => 200
    [5] => 233
)

Php demo

0 голосов
/ 10 июля 2019

изменить регулярное выражение на это

((^.*)(\[{1}[0-9]+:[0-9]+:[0-9]+:[0-9]+\]{1}) )?(\"{1}.+\"{1}) ([0-9]+) ([0-9-]+)

для 141.243.1.172 [29: 23: 53: 25] "GET /Software.html HTTP / 1.0" 200 233

результат будет

Array
(
    [0] => 141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
    [1] => 141.243.1.172 [29:23:53:25] 
    [2] => 141.243.1.172
    [3] => [29:23:53:25]
    [4] => "GET /Software.html HTTP/1.0"
    [5] => 200
    [6] => 233
)

и для [29: 23: 53: 25] "GET /Software.html HTTP / 1.0" 200 233

результат будет

Array
(
    [0] => [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
    [1] => [29:23:53:25] 
    [2] => 
    [3] => [29:23:53:25]
    [4] => "GET /Software.html HTTP/1.0"
    [5] => 200
    [6] => 233
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...