PHP preg_match регулярное выражение - PullRequest
2 голосов
/ 26 ноября 2010
$var = '<lang test=<php>string</php>><lang test2=before<php>inside</php>>'.
       '<lang test3=THIRD_WITHOUT_PHP_TAGS><lang test4>';
if (preg_match_all('#<lang (.*?)>#', $var, $gg))
{
    var_dump($gg[1]);
}

Я получаю дамп:

array(2) {
  [0]=>
  string(9) "test=<php"
  [1]=>
  string(16) "test2=before<php"
}

Но я хочу получить:

test=<php>string</php>

и

test2=before<php>inside</php>

и

test3=THIRD_WITHOUT_PHP_TAGS

и

test4

Как это сделать?

EDIT: Я изменяю $ var и добавляю третье выражение

РЕДАКТИРОВАТЬ 2: ADEED четвертое выражение без "="

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

Самый простой способ:

#<lang (\w+=[^<]*(<[^>]+>)?[^<]+(?(2)</[^>]+>))>#

Regex проверяет, соответствует ли тег, и только затем проверяет наличие конечного тега.

Если вы хотите перехватить также четвертый аргумент, вынужно использовать

#<lang (\w+(=[^<]*(<[^>]+>)?[^<]+(?(3)</[^>]+>))?)>#
0 голосов
/ 26 ноября 2010

Я бы сделал это так:

preg_match("/<lang (.*)>/i", $var, $gg)
0 голосов
/ 26 ноября 2010
$var = '<lang test=<php>string</php>><lang test2=before<php>inside</php>>';
if (preg_match_all('#<lang (.*>)>#U', $var, $gg))
{
    var_dump($gg[1]);
}
...