我试图删除HTML属性周围的单引号和双引号,但有以下限制:
1)引用的材料必须存在 标记<>
内(例如,<mytag b="yes">
变为<mytag b=yes>
,但<script>var b="yes"</script>
保持不变。
2)引用的材料可能没有空格字符也没有等号(例如,<mytag b="no no" c="no=no">
保持不变)。
3)引用的材料可能不属于href
或src
定义。
4)正则表达式应该适用于UTF-8(呃!)
有人在这里发布了一个几乎完全相同的问题,得到了一个在问题范围内有效的答案:
所以:
((\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
他的解决方案将模式和替换参数配对在两个数组中,正如您所见,所以我需要遵循他的语法,使用#
等。
你的解决方案得到我的支持!
答案 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;。
'~(?:<\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);