2017-02-13 31 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. 
相關問題