2014-04-15 55 views
0

我正在用不同長度的新值替換子字符串。我對substr_replace有一個模糊的把握,但是如果relaces字符串比原始字符串短,它會留下額外的字符。PHP替換不同長度的子字符串

基本字符串我需要編輯看起來像這樣

In Target(+-50%): <span style="color: red">33%</span>(1/3)<br> 

我需要跨度標籤閉幕>之後和BR標籤開幕<之前取代一切。但是,字符的數量會有所不同。

例如:我想刪除的字符串是「33%(1/3)」,它是7個字符。我想用它爲16個字符的「9%(9/100)」替換它。我不想覆蓋br標籤。

這看起來應該很簡單,但我無法繞開它。我應該看preg_replace嗎?

+0

你需要regex來做到這一點...... –

+1

@HenriqueBarcelos現在你有兩個問題。只是開玩笑:) – user1477388

+0

你的目標字符串實際上是'33%(1/3)',還是你引用的HTML?他們是兩個*非常*不同的問題,請澄清是哪種情況。 – Sammitch

回答

2
<?php 
$subject = 'In Target(+-50%): <span style="color: red">33%</span>(1/3)<br>'; 
$pattern = '/<span\b[^>]*>(.*?)<\/span>(.*?)<br>/'; 
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3); 
$subject = str_replace($matches[1][0], 'REPLACE WITH THIS TEXT', $subject); 
$subject = str_replace($matches[2][0], 'REPLACE SECOND PART WITH THIS TEXT', $subject); 

print_r($subject); 
?> 
+0

這看起來不錯,我想我可以用這個工作。謝謝 – TomCDona

+0

如果在$ subject中存在多個$ pattern模式,爲什麼$ matches不包含所有的匹配?我是否需要重新運行帶有新偏移量的preg_match? – TomCDona

+0

現在我遇到$匹配[1] [0]出現在我的$主題中的其他地方(比我列出的時間長)的條件。我如何才能替換匹配區域中的特定文本? – TomCDona

-1

這應該分開你需要:

preg_match('#(<span[^>]*>)(\d+\%)(</span>)(\(\d+/\d+\))#', $str, $matches); 
var_dump($matches); 

然後你可以使用str_replace與匹配。

+0

@downvoter,心態評論? –

+0

你的正則表達式是具體的,如果第一個值是小數或者最後一個數不是小數? – Stefan

+0

夥計們,看看張貼的示例字符串OP。我可以說你的正則表達式太籠統了。 –