2015-03-16 2 views
2

У меня есть пользовательский PHP скрипт с текстом шаблона, который выглядит, как этотЗаменить шорткоды с регулярным выражением в PHP

Color: [option]color[/option]<br /> 
[if option="manufacturer"]<br /> 
Manufacturer: [option]manufacturer[/option]<br /> 
[/if]<br /> 
Price: [option]price[/option] 

Я использовал preg_replace_callback успешно заменить [опция] цвет [/ параметр] и [опция] Цена [/option] с реальными значениями, такими как White и 10,00 $.

Я использую этот код для простых [опция] короткие номера:

$template = preg_replace_callback('!\[option](\w+)\[\/option\]!', 
           function ($matches) 
           { 
            //Here I get a value of color, price, etc 
            ... 

            return $some_value; 
           }, 
           $template); 

Но я просто немогу понять, что делать с IF заявления ... Он должен проверить, если производитель установлен, а затем замените [вариант] производителя [/ option] и, конечно же, удалите открывание и закрытие, если линия.

выход Результат должен быть

Color: White<br /> 
Manufacturer: Apple<br /> 
Price: $10.00 

Или если есть ни один производитель не определен он должен быть

Color: White<br /> 
Price: $10.00 
+0

Если в строке ввода нет производителя, если он не установлен, вы можете игнорировать оператор if. Просто замените что-либо между значениями [option] и [/ option] tiwh, которые вам нужны, и удалите что-либо внутри скобок [] –

+1

Я предлагаю использовать механизм шаблонов вместо того, чтобы изобретать колесо. –

+0

-Варите себе пользу и используйте подходящий механизм шаблонов или даже простой старый PHP вместо того, чтобы пытаться изобрести колесо в течение 100-го раза. - Что сказал @PeterM. – EJTH

ответ

1

Для if, вы должны добавить второй preg_replace_callback`, и использовать его следующим образом:

$options['color'] = 'white'; 
$options['price'] = '10.00'; 

$template = preg_replace_callback(
    '!\[if option=\"(.*)\"\](.+)\[\/if\]!sU', 
    function ($matches) use ($options) 
    { 
     if (isset($options[$matches[1]])) 
      return $matches[2]; 
     else 
      return ''; 
    }, 
    $template 
); 

То, что вы должны заметить здесь модификаторы sU в конце регулярного выражения.

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

U делает регулярное выражение неровным. И вам это понадобится, иначе ваше регулярное выражение может начаться в начале первого короткого замыкания и продлиться до конца последнего короткого замыкания только для одного события. Вы еще не столкнулись с этой проблемой, потому что у вас нет двух коротких трюков на одной линии в любом месте. Но модификатор s теперь представит эту проблему.

И, кроме того, обратите внимание, что теперь есть две группы, которые соответствуют друг другу. Первый - это опция в if, а вторая - это содержимое if.

Наконец, я бы посоветовал вам не получать значения внутри вашей анонимной функции, так как анонимная функция будет вызываться снова и снова для каждого короткого замыкания. Это даст вам накладные расходы. Скорее получите значения вне анонимной функции и передайте значения вместе, используя ключевое слово use.

+0

Отлично!Это то, что я пытался сделать. Спасибо! Я просто редактирую ваше регулярное выражение так, чтобы оно было! \ [If att = \ "(. *) \" \] (. +) \ [\/If \] \
! SU Таким образом, пустых строк нет (осталось
), если нет опции. – PerS

1
class test { 

    protected $color = 'White'; 
    protected $manufacturer = 'Apple'; 
    protected $price = '$10.00'; 

    public function __construct() { 

     $template = '[option]color[/option] 
        [option]manufacturer[/option] 
        [option]price[/option]'; 

     $temp = preg_replace_callback('!\[option](\w+)\[\/option\]!', 
             function ($matches) 
             { 
              $value = !empty($this->$matches[1]) ? ucfirst($matches[1]) . ': ' . $this->$matches[1] . '<br />' : ''; 
              return $value; 
             }, 
             $template); 
     echo $temp; 
    } 
} 

new test; // call the constructor function 

Он производит следующий вывод:

Color: White <br /> 
Manufacturer: Apple <br /> 
Price: $10.00 

Если значение «Производитель» пуст означает выход стал:

Color: White <br /> 
Price: $10.00 
Смежные вопросы