寻找符合特定条件的HTML属性的正则表达式

时间:2016-05-02 03:17:17

标签: php html regex

我试图删除HTML属性周围的单引号和双引号,但有以下限制:

1)引用的材料必须存在 标记<>内(例如,<mytag b="yes">变为<mytag b=yes>,但<script>var b="yes"</script>保持不变。

2)引用的材料可能没有空格字符也没有等号(例如,<mytag b="no no" c="no=no">保持不变)。

3)引用的材料可能不属于hrefsrc定义。

4)正则表达式应该适用于UTF-8(呃!)

有人在这里发布了一个几乎完全相同的问题,得到了一个在问题范围内有效的答案:

Removing single and double quote from html attributes with no white spaces on all attributes except href and src

所以:

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

...有效,除了它无法隔离标签内的文本(即开关标签之间的文本被错误地编辑,例如<mytag>"The quotes are stripped out here!"</mytag>),并且它没有检查等号( =)在引用的文本中(例如<mytag b="OhNo=TheRoutineRemovedTheQuotesBecauseItDidNotCheckForAnEqualSignInTheQuotedText!">)。

奖励积分:我希望将其整合到这个PHP HTML缩小例程中,除了上述编辑之外,该例程运行良好:

https://gist.github.com/tovic/d7b310dea3b33e4732c0

他的解决方案将模式和替换参数配对在两个数组中,正如您所见,所以我需要遵循他的语法,使用#等。

你的解决方案得到我的支持!

2 个答案:

答案 0 :(得分:1)

这是摆脱引号的纯正式正则方法:

angular.element('p.ng-binding').each(function() {
    self = angular.element(this)
    self.parent().find('input').css('width', self.width());
});

请参阅regex demo,替换为&#39; $ 1&#39;。

IDEONE demo

'~(?:<\w+|(?!^)\G)(?:\s+(?:src|href)=(?:"[^"]*"|'[^']*'))*\s+(?!(?:href|src)=)\w+=\K(?|"([^\s"=]*)"|'([^\s'=]*)')~u'

模式细节:

  • $re = '~(?:<\w+|(?!^)\G)(?:\s+(?:src|href)=(?:"[^"]*"|\'[^\']*\'))*\s+(?!(?:href|src)=)\w+=\K(?|"([^\s"=]*)"|\'([^\s\'=]*)\')~u'; $str = "<mytag src=\"src_here\" b=\"yes\" href=\"href_here\"> becomes <mytag src=\"src_here\" b=yes href=\"href_here\">\n<mytag b='yes'> becomes <mytag b=yes>\nbut <script>var b=\"yes\"</script> stays intact\n<mytag b=\"no no\" c=\"no=no\"> stays intact\n<tag href=\"something\"> text <tag src=\"dddd\"> intact"; $subst = "$1"; $result = preg_replace($re, $subst, $str); echo $result; - 将标记((?:<\w+|(?!^)\G))或(<\w+)与上次成功匹配的结尾(|)匹配
  • (?!^)\G - 匹配不受欢迎的(?:\s+(?:src|href)=(?:"[^"]*"|\'[^\']*\'))*href属性,以便稍后使用src
  • 省略它们
  • \K - 匹配1+空格
  • \s+ - 1 +个字母数字或下划线字符((?!(?:href|src)=)\w+=),后跟\w+=href=(请参阅src=否定前瞻)
  • (?!(?:href|src)=) - 省略到目前为止匹配的全文
  • \K - 分组重置组捕获到组1中:
    • (?|"([^\s"=]*)"|\'([^\s\'=]*)\') - 双引号属性,没有"([^\s"=]*)"=和空白
    • ' - 或
    • | - 单引号属性,没有\'([^\s\'=]*)\'=和空白

答案 1 :(得分:0)

使用此(<[^=]*?(?<!href)(?<!src)=)"((\p{L}|\d)+)"(.*?>)并在替换发生时用preg_replace替换第1,第2和第4个捕获组。

$a = '<aaa href="123ff" bbb="aaa">';
do {
  $b = preg_replace('/(<[^>]*?(?<!href)(?<!src)=)"((\\p{L}|\\d)+)"(.*?>)/u', '$1$2$4', $a, -1, $count);
  if(!$count) {
    break;
  }
  $a = $b;
}while(true);