Регулярное выражение с неизвестной длиной символа
Простой вопрос для вас, ребята. Извините, что я должен спросить это.
На моем сайте я хочу использовать подписи в "случайных" местах в моем тексте. Проблема в том, что в данной строке может быть несколько РАЗНЫХ подписей.
Код подписи ~~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);
Код...
<?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
)
)