web-dev-qa-db-fra.com

Simple: Comment remplacer "tout entre" avec php?

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

Alors, quel code je cherche?

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

les sorties:

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

Une fonction générique:

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);
}

D&EACUTE;MO

19
Felix Kling
$string = "<tag>i dont know what is here</tag>"

$string = preg_replace('#(<tag.*?>).*?(</tag>)#', '$1$2', $string)
7
Fivell
$string = "<tag>i dont know what is here</tag>"
$string = "<tag></tag>";
echo $string; // <tag></tag>

ou juste?

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

Désolé, je n'ai pas pu résister. Peut-être que vous mettez à jour votre question avec quelques détails supplémentaires. ;) 

3
Tomalak

Si "tag" change:

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

Si vous devez également remplacer la partie, cette fonction est utile:

$var = "Nate";

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

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

echo $newBody;

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

Je devais remplacer une variable placée dans une zone de texte qui avait été soumise. J'ai donc remplacé firstName par Nate (y compris les accolades).

1
Nate S

Si vous ne savez pas ce qu'il y a dans la balise <tag>, il est possible qu'il y ait une autre balise <tag> dans celle-ci, par exemple. 

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

Et si une fonction générique de remplacement de chaîne ne fera pas le travail.

Une solution plus robuste consiste à traiter la chaîne en tant que XML et à la manipuler avec DOMDocument. Certes, cela ne fonctionne que si la chaîne est valide en tant que XML, mais je pense toujours que c'est une meilleure solution qu'une chaîne de remplacement.

$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>
0
anthonygore