5

2つの記号の間のテキストをにpreg_replace置き換えようとしていますが、空の文字列であるnull出力を取得するため、残念ながらまだ完全には正しくありません。これがこれまでのところです。

$start = '["';
$end   = '"]';
$msg   = preg_replace('#('.$start.')(.*)('.$end.')#si', '$1 test $3', $row['body']);

したがって、私が探している出力の例は次のようになります。

normal text [everythingheregone] after text 

 normal text [test] after text
4

5 に答える 5

8

$startと$endを配列として定義していますが、通常の変数として使用しています。コードを次のように変更してみてください。

$start = '\[';
$end  = '\]';
$msg = preg_replace('#('.$start.')(.*)('.$end.')#si', '$1 test $3', $row['body']);
于 2013-02-12T12:14:21.810 に答える
1

どうですか

$str  = "normal text [everythingheregone] after text";
$repl = "test";
$patt = "/\[([^\]]+)\]/"; 
$res  = preg_replace($patt, "[". $repl ."]", $str);

降伏する必要がありますnormal text [test] after text

編集

ここでフィドルデモ

于 2013-02-12T12:19:25.233 に答える
1

役立つかもしれないいくつかの機能

function getBetweenStr($string, $start, $end)
    {
        $string = " ".$string;
        $ini = strpos($string,$start);
        if ($ini == 0) return "";
        $ini += strlen($start);    
        $len = strpos($string,$end,$ini) - $ini;
        return substr($string,$ini,$len);
    }

function getAllBetweenStr($string, $start, $end)
    {
        preg_match_all( '/' . preg_quote( $start, '/') . '(.*?)' . preg_quote( $end, '/') . '/', $string, $matches);
        return $matches[1];
    }
于 2013-02-12T12:28:56.247 に答える
0
$row['body']= "normal text [everythingheregone] after text ";
$start = '\[';
$end = '\]';
$msg = preg_replace('#'.$start.'.*?'.$end.'#s', '$1 [test] $3', $row['body']);
//output: normal text [test] after text done
于 2013-02-12T12:15:17.627 に答える
0

正規表現のアプローチがあります。正規表現は次のとおりです。\[.*?]

<?php
$string = 'normal text [everythingheregone] after text ';
$pattern = '\[.*?]';
$replacement = '[test]'
echo preg_replace($pattern, $replacement, $string);
//normal text [test] after text
?>
于 2013-02-12T12:20:18.653 に答える