2017-07-20 49 views
2

正則表達式是不是我的強項,我可能過於複雜,但我已經設法想出這似乎符合我的需要的模式。如何更換組匹配,保持一切完好?

\[img.*\].*photobucket.*(.jpg)\[\/img.*\] 

這裏有一個演示:

https://regex101.com/r/fo98tP/6

,我想用 「. JPG〜原來的標準」,更換小組賽(即 「. JPG」)。

我已經想通了如何獲得與preg_match_all的比賽,但我還沒有線索如何使置換並注入它放回文本的原始塊。

爲了給出一些背景知識,這是嘗試和解決新的盜鏈策略,目的是讓我的PHP腳本遍歷我的phpBB論壇上的所有消息,並執行搜索並替換上述內容,然後更新帖子,如果有一直是比賽/替補。如果它可以在MySQL中直接完成,但我試圖在我可以運行之前走路!

非常感謝任何幫助;我頭疼!

回答

1

我認爲你正在尋找preg_replace($pattern, $replacement, $text)

因此,假如您正則表達式是正確的,它似乎是工作。 (個人而言,我會做出這樣改變\[img.*\]\[img[^]]*\]一些小的修改,但是這可能只是一種風格的東西)。您只需添加兩個捕獲組。

(\[img.*\].*photobucket.*)(.jpg)(\[\/img.*\]) 

這使您可以使用這些參考捕獲組在您更換。

$replace = "$1$2~original$3"; 

非常簡單 - 你只是重寫原始文本的匹配部分,以包含你想要的「〜original」。

整個代碼塊可能是這樣的:

$text = "Steering damper mounts finished - without the connecting rod the damper would get bent: 
[url=http://s557.photobucket.com/user/realboss7669/media 
/C85A0F5D-413D-4779-9F09- 
BD43BB798238_zpse8s6dxyu.jpg.html:jaeyh8wg] 
[img:jaeyh8wg]http://i557.photobucket.com/albums 
/ss16/realboss7669/C85A0F5D-413D-4779-9F09 
BD43BB798238_zpse8s6dxyu.jpg[/img:jaeyh8wg][/url:jaeyh8wg]"; 

$pattern = "/(\[img.*\].*photobucket.*)(.jpg)(\[\/img.*\])/i"; 

$replace = "$1$2~original$3"; 

$text = preg_replace($pattern, $replace, $text); 
+1

謝謝,我只是從沒想過要定義更多的組!感謝您瀏覽以及實際的PHP代碼。雖然我確實在下面使用了sln的正則表達式,但在我看來,只有2組而非3是必需的。非常感謝你們兩位!給我拉了很多頭髮。 – willdashwood

1

是的,你可以做一個全局替換,只要使用正確的捕捉組。

.jpg[/img:jaeyh8wg]
\ ^
既然你想在這裏插入,你只需要兩個組將其拆分。

而且,因爲你正在尋找最接近的封閉的,最好使用
非貪婪量詞.*?

https://regex101.com/r/fo98tP/10

所以這是一個
查找(\[img.*?\].*?photobucket.*?.jpg)(\[\/img.*?\])
更換$1~original$2

+1

感謝您的輸入。這個正則表達式完美。我只是接受了斯科特的答案,因爲PHP代碼是爲了一個絕對白癡的答案而作出的。非常感謝! – willdashwood

相關問題