繁体   English   中英

PHP用数组值替换所有字符串出现

[英]php replace all string occurances with values from array

我有一个包含图像ID的字符串和一个数组,该数组的键具有旧图像ID的值,而值具有新图像ID的值。

我需要在内容中搜索旧内容,并用新内容替换。

我已经做到了

<?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 );
        }
    }
}

但是,如果您使用$string print_r ,您会注意到它替换了每次出现的id(应该如此),但这也将替换跨度中的顶部填充(例如)。 所以最后我得到4025px的顶部填充,这不是很好:D

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

但是我被困住了。

您的代码的问题在于str_replace()将替换字符串中$matched_image_id任何实例,而不仅仅是image='...'字符串中的那些实例。 您需要使其更具体:

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

但是您可以使用preg_replace_callback()完成整个操作,因此您只替换与regexp匹配的部分。 回调函数可以查找数组中ID的替换。

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

丑陋,但是行得通

$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.

也许您可以使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM