【问题标题】:Get everything between strings and replace with something else获取字符串之间的所有内容并替换为其他内容
【发布时间】:2025-12-03 11:30:01
【问题描述】:

我正在尝试从 $html 字符串中获取 {code} 标记之间的所有内容。

到目前为止,我已经写了这个,但这并没有按预期工作,只是替换了第一个 {code}

我也希望它适用于许多代码标签,但还没有到这一步。

<?php    

$html = <<< EOT
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>{code}My test code 1{/code}</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
EOT;

$startPos = strpos($html, '{code}');
$endPos = strpos($html, '{/code}');
if($startPos !== false && $endPos !== false){
    $startPos += 6; # strlen('{code}')
    $endPos += 7; # strlen('{/code}')

    // get code
    $code = substr($html, $startPos, $endPos);

    // remove all code apart from start {code}
    $html = substr($html, $startPos-6, $endPos);

    // replace new code
    $new_code = 'test';
    $html = str_replace('{code}', $new_code, $html);
}

echo $html;

结果:-http://codepad.viper-7.com/T9sbbN

test我的测试代码1{/code}

Lorem ipsum dolor sit amet,consectetur adipiscing elit。

预期结果

Lorem ipsum dolor sit amet,consectetur adipiscing elit。

测试

Lorem ipsum dolor sit amet,consectetur adipiscing elit。

【问题讨论】:

  • 预期结果是什么?
  • @Arian 刚刚添加了这个
  • 如果有多个{code}addasdf{/code} 标签,您是否希望将它们全部替换为$new_Code
  • 作为一个很好的例子,是的,它在实际应用程序中进行数据库查找。

标签: php


【解决方案1】:

这适用于一个{code}。

<?php

$html = <<< EOT
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>{code}My test code 1{/code}</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
EOT;

$startPos = strpos($html, '{code}');
$endPos = strpos($html, '{/code}');

if($startPos !== false && $endPos !== false){
    $startPos += 6; # strlen('{code}')


    // get code
    $code = substr($html, $startPos, $endPos-$startPos);


    // replace new code
    $new_code = 'test';
    $html = str_replace('{code}'.$code.'{/code}', $new_code, $html);
}

echo $html;

多个可能看起来像这样:

<?php

$html = <<< EOT
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>{code}My test code 1{/code}</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.{code}hi{/code}</p> 
EOT;

$html = test($html);

echo $html;

function test($html){
    do{
        $startPos = strpos($html, '{code}');
        $endPos = strpos($html, '{/code}');

        if($startPos !== false && $endPos !== false){
            $startPos += 6; # strlen('{code}')

            // get code
            $code = substr($html, $startPos, $endPos-$startPos);

            // replace new code
            $new_code = 'test';
            $html = str_replace('{code}'.$code.'{/code}', $new_code, $html);
        }

    }while($startPos !== false && $endPos !== false);


    return $html;
}

【讨论】:

  • 谢谢完美的作品,我认为这比做一个大字符串替换稍微好一点是正确的吗? $html = substr($html, 0, $startPos-6) . $new_code . substr($html, $endPos+7);
  • @JohnMagnolia 是的,它使您能够通过在函数中进行编辑来编辑功能...另请注意,此代码不考虑 {code}This is {code}here{/code} and here{/code} 的嵌套情况
  • 哇,这会变得越来越复杂,幸好现阶段还不需要。
【解决方案2】:

正则表达式示例

$html = preg_replace('/{code}.*{\/code}/', 'test', $html);

使用您的代码:here

查看酷 reg exp builder:regexper

【讨论】:

  • 我怎样才能把它分解成先获取代码,这样我就可以执行我的逻辑,然后像你这里一样替换它是完美的。
  • 你可以使用limit,第4个参数到preg_replace documentation
最近更新 更多