Просто: как заменить" все Между " на php?

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

Итак, какой код я ищу?

6 ответов


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

универсальный функция:

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

демо


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

$string = preg_replace('#(<tag.*?>).*?(</tag>)#', '', $string)

$string = "<tag>i dont know what is here</tag>"
$string = "<tag></tag>";
echo $string; // <tag></tag>

или просто?

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

извините, не удержался. Возможно, вы обновите свой вопрос еще несколькими деталями. ;)


если "тег" изменения:

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

если вы не знаете, что находится внутри <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>