regex извлекает / заменяет значения из xml-подобных тегов через именованные (под) группы - PullRequest
0 голосов
/ 17 сентября 2009

Попытка создать простой текст-переводчик в PHP.

Это должно соответствовать чему-то вроде:

Bla bla {translator id="TEST" language="de"/}

Язык может быть необязательным

Blabla <translator id="TEST"/>

Вот код:

$result = preg_replace_callback(
  '#{translator(\s+(?\'attribute\'\w+)="(?\'value\'\w+)")+/}#i',
  array($this, 'translateTextCallback'), 
  $aText
);

Извлекает "атрибуты", но выбирает только последний. Моя первая мысль была связана с именами групп, когда PHP перезаписывает (именованные) элементы массива при каждом совпадении. Но если оставить имя группы, он также вернет только последнее совпадение.

Вот массив, который возвращается к обратному вызову в качестве примера

Array
(
    [0] => {translator id="TEST" language="de"/}
    [1] =>  language="de"
    [attribute] => language
    [2] => language
    [value] => de
    [3] => de
)

1 Ответ

1 голос
/ 17 сентября 2009

Когда вы повторяете группу, вы получаете только последнее совпадение. Обойти это невозможно. Вам необходимо сопоставить весь набор атрибутов / значений, а затем проанализировать их в коде.

...