2013-06-13 2 views
0

У меня есть постоянную ссылку, как это:Заменить первый матч preg_match?

example.com/cyclone/2013/06/05/introduction/

Это сообщение относится к обеим категориям «циклона» и «погода», но «циклон» берет на себя в этом Permalink.

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

if(in_array('weather', $cats)) { 
     $pattern = '#([^/]+)/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?#'; 
     if(preg_match($pattern, $permalink, $matches)) { 
      if($matches[1] && $old_cat = get_category_by_slug($matches[1]) && 'weather' !== $matches[1]) { 
       preg_replace('/' . $matches[1] . '/', $new_cat, $permalink); 
       return $permalink; 
      } 
     } 
    } 

К сожалению, $ matches [1] не является допустимым «шаблоном», который будет использоваться в preg_replace. Как заменить первое соответствие preg_match?

ответ

0

Попробуйте использовать функцию preg_replace_callback:

$permalink = preg_replace_callback('~[^/]++(?=\d{4}/\d{2}/\d{2}/[^/]++)~', 
    function ($m) use ($new_cat, $old_cat) { 
     if ($old_cat == get_category_by_slug($m[0]) && 'weather' !== $m[0]) 
      return $new_cat; 
    }, 
    $permalink); 

Обратите внимание, что preg_replace и preg_replace_callback не изменяющими строку, а возвращает измененную строку.

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