2017-02-13 95 views
-1

我有一个字符串,其中包含图像ID和一个数组,其中包含旧图像ID和新图像ID的值。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你会发现,它取代了ID的每次出现(因为它应该),但也将取代顶部填充在跨度(例如)。所以在最后我得到了4025px的顶部填充,这是不好的:D

我想首先用正确的ID替换匹配的数组,找到整个匹配的模式(image='150'),然后匹配替换后的值内容。

但我卡住了。

+0

*但是这也将取代a中的顶部填充跨度* - 无法重现。我刚刚测试了你的代码,它在其他文本中输出了'' – RomanPerekhrest

+0

@RomanPerekhrest我在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(),所以你只能更换匹配的正则表达式的部分。回调函数可以查找数组中ID的替换。

$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 +)\”/''图像属性是'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. 
相关问题