在PHP中按顺序preg_replace img标记

时间:2017-08-25 02:34:19

标签: php regex preg-replace preg-match-all

我有一个内容,就像

Test test test <img src="abc.png" alt='1'> test test <img src="123.png" alt='2'> test test

我想将其更改为

Test test test <id>1</id> test test <id>2</id> test test

我试过了:

preg_match_all('/<img(.*?)alt=\"(.*?)\"(.*?)>/si', $content, $result, PREG_SET_ORDER);
foreach($result as $val) {                
          $content = preg_replace('/<img(.*?)alt=\"(.*?)\"(.*?)>/si', '<id>'.$val[2].'</id>', $content);

但它给了我:

Test test test <id>2</id> test test <id>2</id> test test

3 个答案:

答案 0 :(得分:1)

似乎preg_match *在这里使用是正确的功能,需要循环来证明。它只需要一个preg_replace():

即可完成

preg_replace("/<.*? alt=[\"']([0-9]+)[\"'] *>/", '<id>${1}</id>', $teststr);

这将独立地对每个匹配的表达式进行操作,并一次性完成所有这些操作。如果您确定需要src值,则可以根据需要调整表达式。

答案 1 :(得分:0)

试试这个。

    $data = `Test test test <img src="abc.png" alt='1'> test test <img src="123.png" alt='2'> test test`;

    $replace = ["<img src='abc.png' alt='1'>","<img src='123.png' alt='2'>"];
    $value = ["<id>1</id>","<id>2</id>"];

    $dataNeeded = str_replace($replace, $value, $emailContent);

echo $dataNeeded;

答案 2 :(得分:0)

你在foreach中的替换包含问题。这是固定版本。

<?php

$str = <<<term
Test test test <img src="abc.png" alt='1'> test test <img src="123.png" alt='2'> test test'
term;

preg_match_all('/<img.*?alt=[\'"](\d+)[\'"]>/', $str, $matches, PREG_SET_ORDER, 0);

foreach($matches as $val) {                
    $str = preg_replace('/<img.*?alt=[\'"](' . $val[1] . ')[\'"]>/', '<id>'.$val[1].'</id>', $str);
}

var_dump($str);

在这里查看: http://sandbox.onlinephpfunctions.com/code/ad70f171ec5387451a29166865474de0f223f7c1