2014-05-11 17 views
3

我試圖從單個單詞沒有空格的html屬性中刪除單引號和雙引號。我寫這個正則表達式這不工作:從html屬性中刪除單引號和雙引號,除了href和src之外的所有屬性上都沒有空格

/((type|title|data-toggle|colspan|scope|role|media|name|rel|id|class|rel)\s*(=)\s*)(\"|\')(\S+)(\"|\')/ims 

如何,而不是指定,我想去除引號中的所有HTML標記過,我寧願只列出了幾個屬性,忽略像src和href和刪除引號在所有其他屬性名稱上。所以我寫了下面的那個,但是對我來說這是行不通的。它有一些如何檢測除href和src之外的任何屬性名稱。我嘗試了各種組合。

/((?!href|src)(\S)+\s*(=)\s*)(\"|\')(\S+)(\"|\')/i 

我試過這個,但它不起作用。它只是將h和s從href和src的屬性中刪除。我知道我很接近但錯過了一些東西。我在這花了5個小時。

工作示例

$html_code = 'your html code here.'; 

preg_replace('/((type|title|data-toggle|colspan|scope|role|media|name|rel|id|class|rel)\s*(=)\s*)(\"|\')(\S+)(\"|\')/i', '$1$5', "$html_code"); 
+0

[相關](http://stackoverflow.com/a/4234491/471272)。 – tchrist

回答

1

我修改你寫的更小的正則表達式,造成這樣的:

((\S)+\s*(?<!href)(?<!src)(=)\s*)(\"|\')(\S+)(\"|\') 

當你的版本被解析,先行將一些「H」到前面的' href'並且失敗,然後進入下一個字符。由於'ref'與'href'或'src'不匹配,你的模式的其餘部分將會匹配。

隨着我的修改,任何'href'或'src'最初都會被正則表達式接受。當lookbehind達到時,它會檢查已經解析過的文本中的'href',如果找到則會失敗。

0

此外,它將優選,而不是篩選爲hrefsrc屬性,以篩選出代替=。這裏將是一個良好的正則表達式來做到這一點(這個表達式還假定所有屬性使用雙引號):

// Remove all double quote with attribute that have no space and no `=` character. 
$html = preg_replace('/((\S)+\s*(=)\s*)(\")(\S+(?<!=.))(\")/', '$1$5', $html); 
相關問題