【发布时间】:2014-08-26 18:52:51
【问题描述】:
最终目标是从包含 HTML 标记的字符串中剥离所有 HTML 标记等,仅捕获内联 JS。在被测试的 sn-p 中将只有一个内联 JavaScript。
我希望有一个正则表达式,它可以删除任何 HTML 标记,除了那些包含在引号(' 或 ")中的那些可能有也可能没有换行符。
示例 A(多行):
<!-- ClickTale Top part -->
<script type='text/javascript'>
var WRInitTime=(new Date()).getTime();
var html = '<center>Test</center>';
</script>
<!-- ClickTale end of Top part -->
<center><!-- BLOGHER ADS Begin supplemental 970 ad -->
<script src='http://ads.blogherads.com/97/9737/970.js' type='text/javascript'></script>
<!-- End supplemental 970 ad --></center>
示例 B(全部为一行):
<!-- ClickTale Top part --><script type='text/javascript'>var WRInitTime=(new Date()).getTime(), html = '<center>Test</center>';</script><!-- ClickTale end of Top part --><center><!-- BLOGHER ADS Begin supplemental 970 ad --><script src='http://ads.blogherads.com/97/9737/970.js' type='text/javascript'></script><!-- End supplemental 970 ad --></center>
两者都变成:
var WRInitTime=(new Date()).getTime();
var html = '<center>Test</center>';
目前,我已经创建了这个几乎是我需要的 PHP 函数:
function remove_strip_tags( $str ) {
return preg_replace('%</?script[a-z0-9]*[^<>]*>|<!--.*?-->|<noscript[a-z0-9]*[^<>]*>.*?</noscript>%m', '', $str);
}
这采用我们的例子并产生这个:
var WRInitTime=(new Date()).getTime();
var html = '<center>Test</center>';
<center>
</center>
那么如何去除不在'或"内的html标签?
任何帮助将不胜感激!
【问题讨论】:
-
如果一个用例受到足够的限制,比如“只看脚本”和“只有一个脚本标签”等,是的,可以认为自己很幸运,该案例可以通过正则表达式。不过,这不是通用解决方案。通常最好问“我需要做 X”不是“我需要一个正则表达式来做 X”这样的问题。
-
@RayToal 我知道你来自哪里。作为一个 html 解析解决方案,同意,它不是通用的。作为排除某些模式的正则表达式解决方案,解决方案的形式非常普遍。仍在寻找可以计算平方根并洗衣服的“通用”代码。 :) 我相信我们彼此了解,周末愉快。
-
确实,我确实赞成务实的解决方案。如果正则表达式解决方案有效,那就太好了!最后一句话更多是针对 OP 的;通常最好不要要求特定类型的解决方案,但最好说明问题,因为有时当
indexOf是最佳解决方案时,人们会要求使用正则表达式。是的,完全理解并为您的答案+1。 :)
标签: php regex preg-replace