2011-07-29 60 views

回答

16
$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> 
+0

我假設你想更換標籤的內容,而不僅僅是更換整個字符串。 – rlemon

+0

應該使用lookaround來代替,說實話。 –

+0

運行此代碼,因爲我得到警告:preg_replace()[function.preg-replace]:第1行上的未知修飾符't' – anthonygore

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

或公正?

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

對不起,無法抗拒。也許你用更多的細節更新你的問題。 )

+0

對不起,我dnot知道熱把問題.... – faq

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

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

您在第二個參數中缺少替換字符串:'$ 1'。'new text'''2' – gradosevic

17

一個通用的功能:

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

+1

好於公認的答案。除非需要使用正則表達式替換,否則無需使用正則表達式替換。 – sgroves

3

如果 「標籤」 的變化:

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

如果您不知道<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>