Я застрял. Не то, чтобы я был профессионалом в регулярных выражениях, скорее наоборот. Но мне не удается решить, казалось бы, очевидную задачу.
Исходная строка:
tag:tag1; tag:tag2;tag:tag3; tag:tag4
Мне нужно извлечь теги, т. Е. Все, что находится между «tag:» и следующей точкой с запятой (или концом строки для последнего тега). Лучшее, что я мог получить до сих пор, это
{tag:(?P<tag>[^;]+)(;|$)}i
То есть начать с «tag:», затем разрешить любые символы, кроме точки с запятой, а затем завершить точкой с запятой или концом строки. И делать сопоставление без учета регистра. Но с обоими preg_match
а также preg_match_all
Я получаю только первый тег с этим регулярным выражением 🙁
Альтернативный (но без циклов) метод для достижения того, что я хочу — массив строк тегов — с помощью PHP также имеет значение.
Работает нормально здесь:
$text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4';
preg_match_all('{tag:(?P<tag>[^;]+)(;|$)}i', $text, $matches);
print_r($matches['tag']);
Выходы:
Array
(
[0] => tag1
[1] => tag2
[2] => tag3
[3] => tag4
)
Использование str_replace () + explode (), как предложил Jelle Keizer.
<?php
$text = 'tag:tag1; tag:tag2;tag:tag3; tag:tag4';
$text = str_replace(array('tag:', ' '),array('', ''), $text);
$array = explode(';', $text);
var_dump($array);
Выходы:
Array
(
[0] => tag1
[1] => tag2
[2] => tag3
[3] => tag4
)