Шаблон preg_replace - PullRequest
       15

Шаблон preg_replace

1 голос
/ 22 марта 2010

я не очень тверд с preg_replace - другими словами, я не совсем понимаю - поэтому я надеюсь, что вы можете мне помочь.

У меня есть строка в тексте, подобная этой: [demo category=1] ихотите заменить содержимым категории (id = 1), например "This is the Content of my first Category"

Это мой шаблон начальной точки - это все, что у меня есть: '/[demo\s*.*?]/i';

Надеюсь, вы можете помочь?

Ответы [ 4 ]

1 голос
/ 22 марта 2010

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

for ($i = 1; $i <= $max_category; $i++) {
 $category_name = get_category_name($i);
 $s = preg_replace("/\[demo\s+category=(\d+)\]/i", $category_name, $s);
}

или

$s = preg_replace_callback("/\[demo\s+category=(\d+)\]/i", "get_category_name", $s);

в обоих случаях get_category_name ($ id) - это функция, которая получит имя категории для идентификатора. Вы должны проверить оба варианта, чтобы оценить, какой из них быстрее для вашего использования.

1 голос
/ 22 марта 2010

Во-первых, вам нужно убрать квадратные скобки, поскольку они являются специальными символами в PCRE:

'/\[demo\s*.*?\]/i';

Во-вторых, звучит так, как будто вы хотите что-то сделать с цифрой в конце, поэтому вы захотите сделать это, используя скобки:

'/\[demo\s*.*?=(\d+)\]/i';

Скобки захватят \d+ и сохранят его в качестве ссылки. \d+ будет соответствовать только строке чисел.

Наконец, звучит так, как будто вам нужно использовать preg_replace_callback, чтобы выполнить специальную функцию для совпадений, чтобы получить нужную строку:

function replaceMyStr($matches)
{
    $strNum = array("1"=>"first", "2"=>"second", "3"=>"third"); // ...etc
    return "This is the Content of my ".$strNum($matches[1])." Category.";
    // $matches[1] will contain the captured number
}
preg_replace_callback('/\[demo\s*.*?=(\d+)\]/i', "replaceMyStr", "[demo category=1]");
0 голосов
/ 22 марта 2010

Символы [ и ] имеют особое значение (они обозначают классы символов - диапазоны и наборы символов).Вам нужно экранировать [ как \[ (и, очевидно, в PHP, в отличие от других разновидностей регулярных выражений, вам также нужно экранировать ]).Также я предлагаю вам использовать класс символов [^]] = соответствовать любому символу, который ]

/\[demo\s+[^]]*\]/i

должен работать лучше.

Редактировать: если вы хотите извлечьимя и номер, то вы можете использовать

/\[demo\s+(\w+)\s*=\s*(\d+)\]/i
0 голосов
/ 22 марта 2010

Шаблон будет выглядеть так

/\[demo\s+category=(\d+)\]/i'

(вам нужно избегать скобок, потому что они особенные)

...