Preg_Match_All: два значения в шаблоне - PullRequest
0 голосов
/ 05 октября 2010

У меня есть пользовательские теги [tag val=100][/tag]. Как мне получить val и все, что идет между тегами?

например:

[tag val=100]apple[/tag]  

значение1 = 100
значение2 = яблоко

edit: что если бы у меня было несколько элементов внутри тега
например:

[tag val=100 id=3]

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Если в вашем вопросе есть строка, подобная этой, вы можете использовать preg_match вместо preg_match_all:

$str = "[tag val=100]apple[/tag]";

preg_match("/\[.+? val=(.+?)\](.+?)\[\/.+?\]/", $str, $matches);

$value = $matches[1];    // "100"
$content = $matches[2];  // "apple"

Обновление: Я вижу, у вас может быть несколько атрибутов в каждом элементе. В этом случае это должно работать:

// captures all attributes in one group, and the value in another group
preg_match("/\[.+?((?:\s+.+?=.+?)+)\](.+?)\[\/.+?\]/", $str, $matches);

$attributes = $matches[1];
$content = $matches[2];

// split attributes into multiple "key=value" pairs
$param_pairs = preg_split("/\s+/", $attributes, -1, PREG_SPLIT_NO_EMPTY);
// create dictionary of attributes
$params = array();
foreach ($param_pairs as $pair) {
    $key_value = explode("=", $pair);
    $params[$key_value[0]] = $key_value[1];
}
1 голос
/ 05 октября 2010

Это будет регулярное выражение для него:

'#\[tag val=([0-9]+)\]([a-zA-Z]+)\[\/tag])#'

Val будет числом, а ваше «яблоко» может быть одним или несколькими вхождениями буквенных символов. Замените [a-zA-Z]+ на .+?, если хотите сопоставить больше символов.

...