2014-08-29 3 views
0

Я имеющий PHP массив так:Как заменить preg_replace PHP

$_0xb29b = ['item1','item2','item3']; 

И у меня есть текстовый файл, как это

_0xb29b[0] foo foo foo foo foo foo _0xb29b[2] 

Можете ли вы, ребята, покажите мне, как заменить _0xb29b[0] в текстовом файле с правильным элементом в массиве? Я хочу, чтобы текст Тхо выглядеть так:

item1 foo foo foo foo foo foo item3 

ответ

2

Использование preg_replace_callback():

<?php 
// header('Content-Type: text/plain; charset=utf-8'); 

$str  = '_0xb29b[0] foo foo foo foo foo foo _0xb29b[2], _0xb29b[xxx]'; 
$_0xb29b = ['item1','item2','item3', 'xxx' => 5]; 

$result = preg_replace_callback(
    '/\_0xb29b\[([^\]]+)\]/', 
    function($matches)use($_0xb29b){ 
     return $_0xb29b[$matches[1]]; 
    }, 
    $str 
); 

echo $result; 
?> 

Шоу:

item1 foo foo foo foo foo foo item3, 5 

Примечание: Чтобы получить содержимое файла в виде строки I предложите прочитать руководство по адресу file_get_contents().

+0

@ NguyễnĐăngKhoa Вы можете добавить пример? – BlitZ

+0

Как насчет того, когда это не только число, но и текст типа _0xb29b [текст], и в коде есть правильный элемент? – thangngoc89

+0

смотрите мой ответ. Спасибо за помощь – thangngoc89

0

Я потратил слишком много времени, чтобы заставить это работать, чтобы не опубликовать его. Не использует preg_match, но в значительной степени реплицирует его. Сначала он создает иглу из имени переменной. Затем выполняется поиск игл в стоге сена с использованием substr_count и strpos. Затем использует позиции найденных игл и длину иглы, чтобы захватить индекс переменной и заменить с помощью массива переменной, используемой для создания иглы. Ссылки на все источники внизу.

<?php 

function print_var_name($var) { 
    foreach($GLOBALS as $var_name => $value) { 
     if ($value === $var) { 
      return $var_name; 
     } 
    } 
    return false; 
} 

$_0xb29b = array('item1','item2','item3'); 

$needle = print_var_name($_0xb29b); 
$needle_length = strlen($needle); 
$haystack = '_0xb29b[0] foo foo foo foo foo foo _0xb29b[2]'; 
$haystack_height = strlen($haystack); 

$num_needles = substr_count($haystack,$needle) . '<br />'; 
if($num_needles>0){ 
    $offset = 0; 
    for($i=0;$i<$num_needles;$i++){ 
     $needle_pos[$i] = strpos($haystack,$needle,$offset); 
     $needle_index[$i] = substr($haystack,$needle_pos[$i]+$needle_length+1,1); 
     if($needle_pos[$i]+$needle_length+3<$haystack_height){ 
      $haystack = substr($haystack,0,$needle_pos[$i]). ' ' .${$needle}[$needle_index[$i]] . ' ' . substr($haystack,$needle_pos[$i]+$needle_length+3); 
     } else { 
      $haystack = substr($haystack,0,$needle_pos[$i]). ' ' .${$needle}[$needle_index[$i]]; 
     } 
     $offset = $needle_pos[$i]+1; 
    } 
} 
echo $haystack; 
?> 

[Переменные переменные] [1] используется для включения строки обратно в переменный с проблемой переменного, являющийся массивом и используя

${$needle}[index] 

для вызова индекса массива.
http://php.net/manual/en/language.variables.variable.php
http://php.net/manual/en/function.substr.php
http://php.net/manual/en/function.strpos.php
http://php.net/manual/en/function.substr-count.php
How to get a variable name as a string in PHP?

+0

Я вижу, что это очень хороший метод. Я узнаю о вашем методе :) – thangngoc89

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