2013-07-26 3 views
-2

У меня есть выражение, именно это: {галерея ID = «2»}Как я могу найти и заменить подстроку с помощью PHP regexp?

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

Более конкретно, я хочу сделать следующее:

Строка внутри содержания:

{gallery id='2'} 

С preg_replace_callback() Я хочу, чтобы вызвать эту функцию:

function changeNumberToGalleryName($id){ 
    //get name of the gallery from database where ID = $id 
    .... 
    .... 
    return $galleryname; 
} 

Я хочу заменить {gallery id = '2'} с название галереи.

Спасибо за консультацию!

+0

Ну, вам нужно выражение явно; вы пробовали написать один? –

+0

** Попробуйте написать что-то самостоятельно **, а затем, если это не сработает, принесите его нам, чтобы помочь вам. Вы начинаете, мы помогаем. Мы не пишем его для вас. Покажите нам фактический код, который вы пробовали, а затем мы можем вам помочь. Скорее всего, вы получите довольно близко к ответу, если сначала попробуете сами. –

ответ

2
preg_replace("/{\s?\w+\s?id\s?=\s?'\d+'\s?}/", $gallername, $text); 
+1

Несколько незначительных комментариев: вам не нужно [] вокруг \ w и \ d, если они являются единственными подходящими символьными классами, и вы можете разрешить 0 или более пробелов (\ s *) между различными жетоны. Возможно, что-то вроде '{\ s * \ w + \ s + id \ s * = \ s * '\ s * \ d + \ s *' \ s *}' будет более надежным. –

+0

@PhilPerry - Спасибо! –

0

Если вы не хотите изменить функцию, которую вы можете сделать это следующим образом:

$str = preg_replace_callback('~{gallery id=\'\K\d+~', 
          function ($match) { 
           return changeNumberToGalleryName($match[0]); 
          }, 
          $str); 

Но если вы можете изменить его (т.е. заменить все вхождение $id по $id[0] в его теле) , вы можете написать:

$str = preg_replace_callback('~{gallery id=\'\K\d+~', 
          'ChangeNumberToGalleryName', 
          $str); 

Но вам нужна действительно функция для этого? Если имена галереи находятся в ассоциативный (или индексированный) массив, например:

array(
"1" => "gallery 1 name" 
"2" => "gallery 2 etc. 
) 

or 

array('nop', 'gallery 1 name', 'gallery 2 name' ...) 

      вы должны использовать только анонимную функцию:

$str = preg_replace_callback('~{gallery id=\'\K\d+~', 
          function ($match) { return myarray[$match[0]]; }, 
          $str); 
0

Matching полный тег и захватывая идентификатор :

$re = "/{gallery id='([^']+)'}/"; 
preg_replace_callback($re, function($match) { 
    return changeNumberToGalleryName($match[1]); 
}, $string); 

выражение ([^']+) соответствует ничего, пока апостроф не будет найден и захватывает FO und string в первую ячейку памяти совпадения; Позднее я использую $match[1], чтобы передать значение.

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

Смежные вопросы