preg_match_all, чтобы вернуть все совпадающие строки и исключить шаблон, который был сопоставлен

Я обрабатываю большой кусок данных и пытаюсь вернуть все строки в нем, которые содержат строку "INFO:". Мне удалось получить шаблон для возврата данных, которые меня интересуют, но я хотел узнать, как улучшить этот шаблон регулярных выражений, чтобы исключить строку, которую я сопоставляю (а также пробел, если это возможно), поэтому что возвращаются только те данные, которые меня интересуют.

$pattern = "/^.*INFO:.*\$/m";
preg_match_all($pattern, $content, $matches);

INFO:   framerate             25.00
INFO:   width                 480.00
INFO:   height                360.00
INFO:   audioinputvolume      75.00
INFO:   audiocodecid          mp4a
INFO:   audiodatarate         48.00

3 ответа

Решение

Поместите интересующие вас группы в подшаблон ( )

Я думаю, что в вашем случае это будет выглядеть так:

$pattern = "/^.*INFO:(.*)\$/m";

Теперь вы можете увидеть содержимое того, что было в скобках, используя $matches[1][$match]

preg_match_all('/^INFO:\s+([^\s]+)\s+([^\s]+)$/ms', $content, $matches);

Возвращает:

Array
(
    [0] => Array
        (
            [0] => INFO:   framerate             25.00
            [1] => INFO:   width                 480.00
            [2] => INFO:   height                360.00
            [3] => INFO:   audioinputvolume      75.00
            [4] => INFO:   audiocodecid          mp4a
            [5] => INFO:   audiodatarate         48.00
        )

    [1] => Array
        (
            [0] => framerate
            [1] => width
            [2] => height
            [3] => audioinputvolume
            [4] => audiocodecid
            [5] => audiodatarate
        )

    [2] => Array
        (
            [0] => 25.00
            [1] => 480.00
            [2] => 360.00
            [3] => 75.00
            [4] => mp4a
            [5] => 48.00
        )

)

Обратите внимание, что ни одно из полей не может иметь пробелов таким образом.

$pattern = "/INFO:\s+(.*?)\s+(.*?)(\s|$)/m";

Это должно делать свое дело. Материал, указанный в скобках, будет отображаться как элементы в $match [1] и $match [2]

Вот что это вывело бы:

Array
(
[0] => Array
    (
        [0] => INFO:   framerate             25.00

        [1] => INFO:   width                 480.00

        [2] => INFO:   height                360.00

        [3] => INFO:   audioinputvolume      75.00

        [4] => INFO:   audiocodecid          mp4a

        [5] => INFO:   audiodatarate         48.00
    )

[1] => Array
    (
        [0] => framerate
        [1] => width
        [2] => height
        [3] => audioinputvolume
        [4] => audiocodecid
        [5] => audiodatarate
    )

[2] => Array
    (
        [0] => 25.00
        [1] => 480.00
        [2] => 360.00
        [3] => 75.00
        [4] => mp4a
        [5] => 48.00
    )

[3] => Array
    (
        [0] => 

        [1] => 

        [2] => 

        [3] => 

        [4] => 

        [5] => 
    )

)

Существует третий массив всех символов пробела / конца строки, потому что я использовал круглые скобки, чтобы использовать | оператор, чтобы сказать, что пробел ИЛИ конец текста хорошо подходит.

Другие вопросы по тегам