2014-05-11 16 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); 
相关问题