PHP: анализ строки для выполнения замен - PullRequest
0 голосов
/ 25 марта 2009

У меня есть группа текстовых правил, которые структурированы следующим образом:

Rule 1: Do [XXX] when [PN] greater than [N]
Rule 2: Get [PRD ..] and add [X.XX]

Для этого используется массив данных, который переводит каждый сгруппированный код в идентификатор класса CSS (для jQuery).

У меня также есть массив переводов из [ code ] в ID, хранящийся в простом структурированном массиве, как в следующем примере:

$translate = array(
    'XXX' => 'gen-string-input', 
    'PN' => 'gen-positivenumber-input',
    'N' => 'gen-number-input'
);

Важно, чтобы было достигнуто следующее:

Мне нужно заменить каждый экземпляр [ code ] на тег span, который структурирован следующим образом:

<span class="[classname]" unique="[hash]" offset="[offset]">[CODE]</span>

Предполагается, что поля

  • имя класса является результатом массива $ translate
  • хэш - это хэш md5, который является статическим для каждого правила
  • смещение - это положение поля в строке (например, в первом примере поле [XXX] находится в положении 0, [PN] в позиции 1 и т. д.).

Основываясь на этой информации, я ожидаю получить следующий результат для Правило 1 :

<p>
    Do <span class="gen-string-input" 
             unique="[md5]"
             offset="0">[XXX]</span>
    when <span class="gen-positivenumber-input"
               unique="[md5]" 
               offset="1">[PN]</span>
    greater than <span class="gen-number-input" 
                       unique="[md5]" 
                       offset="2">[N]</span>
</p>

Любая помощь очень ценится, в настоящее время я использую str_replace, чтобы попытаться добиться этого, но она не достаточно хороша.

Ответы [ 2 ]

0 голосов
/ 25 марта 2009

Итерация по массиву перевода, замена ключей в строке на значения

$string = '[CODE]';
$translate = array('classname' => 'oddRow', 'hash' => 'abcdef');

foreach($translate AS $key=>$value)
{
$string = str_ireplace('[' . $key . ']', $value, $string);
}
0 голосов
/ 25 марта 2009

Хорошо, на самом деле вам нужно preg_replace_callback. См. Примеры рекурсивного обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...