Регулярное выражение с неизвестной длиной символа

Простой вопрос для вас, ребята. Извините, что я должен спросить это.

На моем сайте я хочу использовать подписи в "случайных" местах в моем тексте. Проблема в том, что в данной строке может быть несколько РАЗНЫХ подписей.

Код подписи ~~USERNAME~~

Так что-нибудь вроде

~~timtj~~
~~foobar~~
~~totallylongusername~~
~~I-d0n't-us3-pr0p3r-ch@r@ct3r5~~

Я пытался использовать preg_match для этого безуспешно. Я понимаю, что третий параметр используется для хранения совпадений, но я не могу правильно получить совпадение из-за формата.

Я не должен использовать preg_matchИли я просто не могу использовать подписи таким образом?

2 ответа

Решение

Вы могли бы использовать preg_match_all и с этим измененным regex

preg_match_all('/~~(.*?)~~/', $str, $matches);

enter image description here

Код...

<?php
$str="~~I-d0n't-us3-pr0p3r-ch@r@ct3r5~~";
preg_match_all('/~~(.*?)~~/', $str, $matches);
print_r($matches[1]);

OUTPUT :

Array
(
    [0] => I-d0n't-us3-pr0p3r-ch@r@ct3r5
)

Это должно работать, но имена пользователей не должны содержать ~~

preg_match_all('!~~(.*?)~~!', $str, $matches);

Выход:

Array
(
    [0] => Array
        (
            [0] => ~~timtj~~
            [1] => ~~foobar~~
            [2] => ~~totallylongusername~~
            [3] => ~~I-d0n't-us3-pr0p3r-ch@r@ct3r5~~
        )


    [1] => Array
        (
            [0] => timtj
            [1] => foobar
            [2] => totallylongusername
            [3] => I-d0n't-us3-pr0p3r-ch@r@ct3r5
        )
)

Первый вложенный массив содержит полные сопоставленные строки, а остальные вложенные массивы содержат сопоставленные группы.


Вы можете изменить порядок, используя флаг PREG_SET_ORDERсм. http://php.net/preg_match_all#refsect1-function.preg-match-all-parameters

<?php
$str = "~~timtj~~ ~~foobar~~ ~~totallylongusername~~ ~~I-d0n't-us3-pr0p3r-ch@r@ct3r5~~";
preg_match_all("!~~(.*?)~~!", str, $matches, PREG_SET_ORDER);
print_r($matches);

Этот код производит следующий вывод

Array
(
    [0] => Array
        (
            [0] => ~~timtj~~
            [1] => timtj
        )

    [1] => Array
        (
            [0] => ~~foobar~~
            [1] => foobar
        )

    [2] => Array
        (
            [0] => ~~totallylongusername~~
            [1] => totallylongusername
        )

    [3] => Array
        (
            [0] => ~~I-d0n't-us3-pr0p3r-ch@r@ct3r5~~
            [1] => I-d0n't-us3-pr0p3r-ch@r@ct3r5
        )
)
Другие вопросы по тегам