web-dev-qa-db-ja.com

シンプル:「すべての間」をPHPで置き換える方法は?

$string = "<tag>i dont know what is here</tag>"
$string = str_replace("???", "<tag></tag>", $string);
echo $string; // <tag></tag>

それで、私はどんなコードを探していますか?

21
faq
$search = "/[^<tag>](.*)[^<\/tag>]/";
$replace = "your new inner text";
$string = "<tag>i dont know what is here</tag>";
echo preg_replace($search,$replace,$string);

出力:

<tag>your new inner text</tag>
24
rlemon

一般的な関数:

function replace_between($str, $needle_start, $needle_end, $replacement) {
    $pos = strpos($str, $needle_start);
    $start = $pos === false ? 0 : $pos + strlen($needle_start);

    $pos = strpos($str, $needle_end, $start);
    $end = $pos === false ? strlen($str) : $pos;

    return substr_replace($str, $replacement, $start, $end - $start);
}

[〜#〜] demo [〜#〜]

24
Felix Kling
$string = "<tag>I do not know what is here</tag>";
$new_text = 'I know now'; 
echo preg_replace('#(<tag.*?>).*?(</tag>)#', '$1'.$new_text.'$2' , $string); //<tag>I know now</tag>
9
Fivell

「タグ」が変更された場合:

$string = "<tag>i dont know what is here</tag>";
$string = preg_replace('|^<([a-z]*).*|', '<$1></$1>', $string)
echo $string; // <tag></tag>
3
labue

一般的で非正規表現のソリューション:

@ felix-klingの回答を変更しました。現在は、針が見つかった場合にのみテキストを置き換えます。

また、針の交換、開始位置、すべての一致の交換用のパラメーターを追加しました。

関数をマルチバイトで安全にするためにmb_関数を使用しました。大文字と小文字を区別しないソリューションが必要な場合は、mb_strpos呼び出しをmb_striposに置き換えます。

function replaceBetween($string, $needleStart, $needleEnd, $replacement,
                        $replaceNeedles = false, $startPos = 0, $replaceAll = false) {
    $posStart = mb_strpos($string, $needleStart, $startPos);

    if ($posStart === false) {
        return $string;
    }

    $start = $posStart + ($replaceNeedles ? 0 : mb_strlen($needleStart));
    $posEnd = mb_strpos($string, $needleEnd, $start);

    if ($posEnd === false) {
        return $string;
    }

    $length = $posEnd - $start + ($replaceNeedles ? mb_strlen($needleEnd) : 0);

    $result = substr_replace($string, $replacement, $start, $length);

    if ($replaceAll) {
        $nextStartPos = $start + mb_strlen($replacement) + mb_strlen($needleEnd);

        if ($nextStartPos >= mb_strlen($string)) {
            return $result;
        }

        return replaceBetween($result, $needleStart, $needleEnd, $replacement, $replaceNeedles, $nextStartPos, true);
    }

    return $result;
}
$string = "{ Some} how it {is} here{";

echo replaceBetween($string, '{', '}', '(hey)', true, 0, true); // (hey) how it (hey) here{
2
Caner
$string = "<tag>i dont know what is here</tag>"
$string = "<tag></tag>";
echo $string; // <tag></tag>

あるいは単に?

$string = str_replace($string, "<tag></tag>", $string);

すみません、抵抗できませんでした。質問をもう少し詳しく更新してください。 ;)

2
Tomalak

<tag>タグの内容がわからない場合は、別の<tag>タグが含まれている可能性があります。

<tag>something<tag>something else</tag></tag>

そのため、一般的な文字列置換関数は機能しません。

より堅牢なソリューションは、文字列をXMLとして扱い、DOMDocumentで操作することです。確かにこれは、文字列がXMLとして有効な場合にのみ機能しますが、文字列の置き換えよりも優れたソリューションであると私は思います。

$string = "<tag>i don't know what is here</tag>";
$replacement = "replacement";

$doc = new DOMDocument();
$doc->loadXML($str1);
$node = $doc->getElementsByTagName('tag')->item(0);
$newNode = $doc->createElement("tag", $replacement); 
$node->parentNode->replaceChild($newNode, $node);
echo $str1 = $doc->saveHTML($node); //output: <tag>replacement</tag>
2
anthonygore

部分も置き換える必要がある場合は、この機能が役立ちます。

$var = "Nate";

$body = "Hey there {firstName} have you already completed your purchase?";

$newBody = replaceVariable($body,"{","}",$var);

echo $newBody;

function replaceVariable($body,$needleStart,$needleEnd,$replacement){
  while(strpos($body,$needleStart){
      $start = strpos($body,$needleStart);
      $end = strpos($body,$needleEnd);
      $body = substr_replace($body,$replacement,$start,$end-$start+1);
  }
  return $body;
}

送信されたテキストエリアに置かれた変数を置き換える必要がありました。それで、firstNameをNate(中括弧を含む)に置き換えました。

1
Nate S