PHP preg_match () не соответствует всем подшаблонам - PullRequest
0 голосов
/ 27 марта 2019

У меня есть preg_match (), которая соответствует шаблону, но не получает ожидаемых совпадений (в третьем параметре).

Мои шаблоны регулярных выражений имеют несколько подшаблонов.

$pattern = "~^&multi&[^&]+(&(?:(p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&(?:(p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";

$string = "&multi&mickael&p-23&george&page-34";

preg_match($pattern, $string, $matches);

Thisэто то, что содержит $ match:

Array
(
    [0] => &multi&mickael&p-23&george&page-34
    [1] => &p-23
    [2] => p-23
    [sad] => 
    [3] => 23
    [4] => 
    [5] => &page-34
    [6] => page-34
    [gogosi] => 34
    [7] => 
    [8] => 34
)

Проблема в том, что [sad] должно иметь значение 23.
Если я не включаю в $ string вторую страницу (стр. 34), причина не обязательна[...]

$string = "&multi&mickael&p-23&george";

[...] У меня хорошие $ совпадения, потому что мой [sad] получил его значение:

Array
(
    [0] => &multi&mickael&p-23&george
    [1] => &p-23
    [2] => p-23
    [sad] => 23
    [3] => 23
)

Но я хочу, чтобы регулярное выражение возвращалось правильнозначение, даже когда у меня есть обе нумерации страниц в строке $.

Что делать, чтобы все подшаблоны имели свою ценность?

Примечание. Слова as ('p', 'page') являются только примерами.Там могут быть любые слова.

Примечание. Приведенные выше данные являются лишь примером.Не предлагайте обходных решений, но что-то хорошее для любых входных данных.

1 Ответ

1 голос
/ 27 марта 2019

Вы можете использовать группу сброса филиалов, (?|...|...):

'~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J'

См. Демо regex .

См. Демоверсию PHP :

$pattern = "~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";
$string = "&multi&mickael&p-23&george&page-34";
if (preg_match($pattern, $string, $matches)) {
    print_r($matches);
}

Вывод:

Array
(
    [0] => &multi&mickael&p-23&george&page-34
    [1] => &p-23
    [2] => p-23
    [sad] => 23
    [3] => 23
    [4] => &page-34
    [5] => page-34
    [gogosi] => 34
    [6] => 34
)
...