2016-03-04 84 views
0

我正在使用正則表達式來替換HTML文件中的圖像源URL。如果不是正則表達式匹配字符串

我想例如與<?= $folder ?>/img/

問題更換img/: 當我運行的正則表達式多次,它會再次更換img/,創建:

<?= $folder ?>/<?= $folder ?>/img 

..和等。有沒有辦法告訴正則表達式來取代img/如果不是<?= $folder ?>/img

我想/^(?:(?!<?= $folder ?>/img).)*$/但不知道如何首先匹配,並檢查它沒有包含<?= $folder ?>/img

+0

我不知道這將是清潔一下,但你可以首先用'[PLACEHOLDER]'替換完整的字符串,然後進行替換,然後再用完整的字符串替換'[PLACEHOLDER]'。我相信你可以用一個正則表達式來替換,但這種方法可能是一種更線性的替代方法。 –

+0

@anubhava我已更新我的問題 – CyberJunkie

+0

爲什麼你使用正則表達式呢?你只需要做一個查找和替換。 – Mikey

回答

2

如果你喜歡的正則表達式,請嘗試:

function matchIfNot(str) { 
 
    var newstr = str.replace(/^(?!(<\?=\s\$folder\s\?>\/))(img\/)/g, "<?= $folder ?>/img/") 
 
    alert("Old string: " + str + "\nNew string: " + newstr) 
 
} 
 

 
matchIfNot("<?= $folder ?>/img/") 
 
matchIfNot("img/")

輸出:

Old string: <?= $folder ?>/img/ 
New string: <?= $folder ?>/img/ 

Old string: img/ 
New string: <?= $folder ?>/img/ 
1

嘗試/(?!<\?= $folder \?>)img\//

在開始的那個位,(?!< ...)是負面後視的標記,也就是說,用於檢查...是否在字符串中較早。在這種情況下,我們檢查字符串
<\?= $folder \?>(注意轉義問號)是否在字符串中較早。 如果在img/的前面發現該部分,則該部分將被拒絕並且不匹配。所以,每個img/的情況只會匹配一次。

這個正則表達式對於多於一個發生次數爲img/的行將失敗。可能有辦法允許多次出現,但它可能是一個非常長的正則表達式;在我看來,通常當正則表達式變得太長時,可能是時候切換到另一種工具了。

+0

請詳細說明這個正則表達式如何回答這個問題。 – JAL

相關問題