2012-01-04 2 views
1

В настоящее время я делаю класс BBCode для своего сайта. Мне нужно сделать следующее.preg_replace_all() related issue

function bbCode([skill]Q[/skill]_________[skill]Q[/skill]_________[skill]Q[/skill]); 

функция BBcode должен заменить все Q в период между [умение] и теги [/ умение], и заменить его на $ skillArray значение [ 'Q']. ($ skillArray зависит от характера.)

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

Немного понятнее версия:

  1. Например, вы находитесь на странице персонажа «Орка».
  2. [умение] Тег Q [/ skill] должен автоматически получить «умение умения Q.».
  3. Например, вы находитесь на странице персонажа «Охотник».
  4. [умение] Тег Q [/ skill] должен автоматически получать имя навыка Q охотника.

Ps. Не хотите использовать взрыв.

+0

Вы хотите заменить все Q или просто что-нибудь между '[skill]' и '[/ skill]'? –

+0

Q должен находиться между [навыком] и [/ skill]. – Aristona

ответ

1

Предполагая, что теги, которые вы хотите заменить находятся в той или иной форме шаблона, вы можете использовать file_get_contents, а затем перебрать теги, которые вы хотите заменить с нужными значениями, например:

$file = file_get_contents ('yourfile.php'); 

$skillArray = array ('Q' => 'Hunter name'); 

foreach ($skillArray as $key => $val) 
{ 
    $file = str_replace ('[skill]' . $key . '[\skill]', $val, $file); 
} 

Thats просто совершенно грубый пример, но если я понимаю, что вы пытаетесь сделать; что должно быть в правильном направлении ....

+0

Это будет цикл только один раз из-за только одного значения в массиве. В комментарии может быть 15x [skill] Q [/ skill] BBCode. Тогда он заменит только первое.

Я хочу, чтобы он заменил их все один раз. – Aristona

+0

Да, это прекрасно, это был пример того, как вы могли его реализовать. Вы могли бы поместить столько элементов в массив, сколько захотите, и он будет зацикливаться на это время ... –

+0

Он должен работать, я согласен, но я ожидал, что он будет работать с различными функциями, такими как preg_replace_all(). Выполнение этого с помощью str_replace в цикле for - это не то, что я хотел. :) – Aristona

1

Это то, что вам нужно

$data = "[skill]Q[/skill]_________[skill]Q[/skill]_________[skill]Q[/skill]"; 
$r['Q'] = "Yahoo"; 
function b($a){ 
    global $r; 
    return $r[$a[1]]; 
} 
$data = preg_replace_callback('|\[skill\](Q)\[\/skill\]|', 'b' , $data); 
var_dump($data); 

Если вы хотите заменить все Q с с синглом «Yahoo» использовать Q+ вместо Q. Если вы хотите совместить все слова, используйте \w+.

+0

Не могли бы вы объяснить функцию B? Не видел функцию, называемую ранее.

Выполняет ли preg_replace_callback функцию второго параметра строки? – Aristona

+0

Это функция обратного вызова, которая вызывается с параметром * matches *. –

1
<?php 
$skillArray=array('Q'=>'fishing'); 
$txt="test [skill]Q[/skill] test"; 
$txt=preg_replace("#\[skill\](.*)\[\/skill\]#e",'$skillArray["$1"]',$txt); 
echo $txt; //test fishing test 
?>