【问题标题】:Regex that captures and removes HTML tags but not within quotes捕获和删除 HTML 标签但不在引号内的正则表达式
【发布时间】: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


【解决方案1】:

我相信您知道这里的大多数人会建议您使用 Dom 解析器来解析 html。也就是说,如果没有其他选择,您可以使用 regex 执行以下操作:

$replaced = preg_replace('~([\'"])[^\'"]*\1(*SKIP)(*F)|<[^>]*>~', '', $yourstring);

the demo 上,请参阅底部的替换。

这个问题是这个问题中向"regex-match a pattern, excluding..."解释的技术的经典案例

这是我们的正则表达式:

(['"])[^'"]*\1(*SKIP)(*F)|<[^>]*>

交替| 的左侧完全匹配'quoted strings'"double-quoted strings" 然后故意失败,之后引擎跳到字符串中的下一个位置。右侧匹配标签,我们知道它们是正确的,因为它们没有被左侧的表达式匹配。

可能的调整

匹配引用字符串的表达式可能会进行调整。例如,如果你想在字符串中允许转义引号,你可以使用像(?&lt;!\\)'(?:\\'|[^'\r\n])*+'这样的野兽

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多