2017-02-13 2 views
-1

У меня есть строка, содержащая идентификаторы изображений и массив, который имеет для ключей идентификаторы старого изображения и значения для новых идентификаторов изображений.php заменит все записи строк со значениями из массива

Мне нужно найти содержимое для старых и заменить на новые.

Я сделал это

<?php 

$string = 'Lorem ipsum dolor sit amet, image="150" consectetur adipisicing elit. Porro voluptatibus omnis nulla quis mollitia dicta quasi voluptatum totam, 
labore doloremque ea fugit consectetur, itaque, ab et odio, est iusto recusandae suscipit? Dignissimos veniam recusandae, magnam, dolor omnis, image="6" 
eveniet laboriosam quas culpa voluptate at officia in natus repellendus assumenda beatae illo repudiandae earum necessitatibus fugit, 
quo error. <span style="padding-top:150px">Esse minima</span>, aut architecto, doloribus quos veritatis reprehenderit. 
Temporibus vitae voluptatibus ea ad similique perspiciatis sed doloribus explicabo error asperiores ab, id aspernatur image="235" eum ducimus magni rerum veniam voluptates, ipsum voluptatum repudiandae dolorum quisquam voluptatem. 
Doloribus nulla voluptate architecto ipsam sed voluptas, maiores rem sequi eos voluptatum iusto rerum odio sapiente sunt minima, image="65" consequuntur aliquid dolor impedit hic. Beatae perspiciatis, incidunt necessitatibus 
voluptas earum cumque, in asperiores id ipsum ducimus veritatis laboriosam eveniet ipsa accusamus! Nulla quasi porro sunt suscipit quibusdam velit 
itaque, voluptates, soluta quaerat consectetur eos doloribus, fugiat quisquam. Quos, ad, dolorum. 
'; 

$array = array(
    '150' => 4025, 
    '6' => 4026, 
    '235' => 4027, 
    '65' => 4028, 
); 

preg_match_all('/image=\"(\d+)\"/', $string, $matches_image); 

if ('' !== $matches_image[1] && ! empty($matches_image[1])) { 
    foreach ($matches_image[1] as $key => $matched_image_id) { 
     if (array_key_exists($matched_image_id, $array)) { 
      $string = str_replace($matched_image_id, $array[ $matched_image_id ], $string); 
     } 
    } 
} 

Но если вы print_r$string вы заметите, что она заменяет каждое вхождение идентификатора (как это должно быть), но также заменить верхний отступы в (например). Поэтому в конце я получаю верхнюю прокладку 4025px, что не очень хорошо: D

Я думал о первой замене сопоставленного массива, который находит весь сопоставленный шаблон (image='150') с правильным идентификатором, а затем сопоставляет заменяемые значения в Контент.

Но я застрял.

+0

* но который также заменит верхнее заполнение в span * - невозможно воспроизвести. Я только что проверил ваш код и вывел '' в другом тексте – RomanPerekhrest

+0

@RomanPrekhrest Я протестировал его в http://sandbox.onlinephpfunctions.com/, и он заменил дополнение как хорошо [изображение] (http://imgur.com/a/RIA6a) –

ответ

3

Проблема с кодом, что str_replace() заменит любой экземпляр $matched_image_id в строке, а не только те, внутри image='...' строк. Вы должны сделать его более конкретным:

str_replace("image=\"$matched_image_id\"", "image=\"{$array[$matched_image_id]}\"", $string); 

Но вы можете делать все это с preg_replace_callback(), так что вы только заменить части, которые соответствуют регулярному выражению. Функция обратного вызова может искать замену идентификатора в массиве.

$string = preg_replace_callback('/image="(\d+)"/', function($match) use ($array) { 
    return "image=\"{$array[$match[1]]}\""; 
}, $string); 
+0

На самом деле это, похоже, делает трюк. Позвольте мне проверить настоящую строку :) –

+1

@AlexBlex Я добавил объяснение проблемы в исходную строку и показал, как она может быть исправлена ​​там. – Barmar

+0

Не работает для меня, но это делает 'preg_replace_callback ('/ image = \" (\ d +) \ "/'' Изображение attr равно 'image =" 999 "' – RiggsFolly

-1

Может быть, вы можете сделать это с помощью str_replace &, изменяя ваш массив немного:

$string = 'Lorem ...'; 

$array = array(
    'image="150' => 'image="4025', 
    'image="6' => 'image="4026', 
    'image="235' => 'image="4027', 
    'image="65' => 'image="4028', 
); 

$new_string = str_replace(array_keys($array), $array, $string); 
+0

Не могу изменить массив, я боюсь –

+0

@dingo_d, почему бы и нет? что вы можете. –

+0

@dingo_d Не удалось создать новый массив, полученный из исходного массива? – Barmar

0

некрасиво, но это работает

$string = 'Lorem ipsum dolor sit amet, image="150" consectetur adipisicing elit. Porro voluptatibus omnis nulla quis mollitia dicta quasi voluptatum totam, 
labore doloremque ea fugit consectetur, itaque, ab et odio, est iusto recusandae suscipit? Dignissimos veniam recusandae, magnam, dolor omnis, image="6" 
eveniet laboriosam quas culpa voluptate at officia in natus repellendus assumenda beatae illo repudiandae earum necessitatibus fugit, 
quo error. <span style="padding-top:150px">Esse minima</span>, aut architecto, doloribus quos veritatis reprehenderit. 
Temporibus vitae voluptatibus ea ad similique perspiciatis sed doloribus explicabo error asperiores ab, id aspernatur image="235" eum ducimus magni rerum veniam voluptates, ipsum voluptatum repudiandae dolorum quisquam voluptatem. 
Doloribus nulla voluptate architecto ipsam sed voluptas, maiores rem sequi eos voluptatum iusto rerum odio sapiente sunt minima, image="65" consequuntur aliquid dolor impedit hic. Beatae perspiciatis, incidunt necessitatibus 
voluptas earum cumque, in asperiores id ipsum ducimus veritatis laboriosam eveniet ipsa accusamus! Nulla quasi porro sunt suscipit quibusdam velit 
itaque, voluptates, soluta quaerat consectetur eos doloribus, fugiat quisquam. Quos, ad, dolorum. 
'; 

$array = array(
    '150' => 4025, 
    '6' => 4026, 
    '235' => 4027, 
    '65' => 4028, 
); 

$find = array_keys($array); 
foreach ($find as &$f) { $f = 'image="'.$f; } 
$repl = array_values($array); 
foreach ($repl as &$r) { $r = 'image="'.$r; } 
print_r($find);print_r($repl); 

$s1 = str_replace($find, $repl, $string); 
echo $s1; 

Результат

Lorem ipsum dolor sit amet, image="4025" consectetur adipisicing elit. Porro voluptatibus omnis nulla quis mollitia dicta quasi voluptatum totam, 
labore doloremque ea fugit consectetur, itaque, ab et odio, est iusto recusandae suscipit? Dignissimos veniam recusandae, magnam, dolor omnis, image="4026" 
eveniet laboriosam quas culpa voluptate at officia in natus repellendus assumenda beatae illo repudiandae earum necessitatibus fugit, 
quo error. <span style="padding-top:150px">Esse minima</span>, aut architecto, doloribus quos veritatis reprehenderit. 
Temporibus vitae voluptatibus ea ad similique perspiciatis sed doloribus explicabo error asperiores ab, id aspernatur image="4027" eum ducimus magni rerum veniam voluptates, ipsum voluptatum repudiandae dolorum quisquam voluptatem. 
Doloribus nulla voluptate architecto ipsam sed voluptas, maiores rem sequi eos voluptatum iusto rerum odio sapiente sunt minima, image="40265" consequuntur aliquid dolor impedit hic. Beatae perspiciatis, incidunt necessitatibus 
voluptas earum cumque, in asperiores id ipsum ducimus veritatis laboriosam eveniet ipsa accusamus! Nulla quasi porro sunt suscipit quibusdam velit 
itaque, voluptates, soluta quaerat consectetur eos doloribus, fugiat quisquam. Quos, ad, dolorum. 
Смежные вопросы