如何从角括号内删除某些字符,将字符留在外面?

时间:2010-05-12 08:01:46

标签: html regex string replace

编辑:要清楚,请理解我没有使用正则表达式解析HTML,这是疯狂的谈话!我只是想清理一个混乱的html字符串,所以它将解析

编辑#2:我还应该指出我正在使用的控制字符是一个特殊的unicode字符 - 在任何正常情况下都不会在正确的标记中使用 < / p>

假设我有一个包含一堆控制字符的html字符串,我想只从内部标记中删除控制字符,只留下标记之外的字符。

例如

这里控制字符是数字“1”。

输入

The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog

期望输出

The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog

到目前为止,我可以匹配包含控制字符的标记,但我无法在一个正则表达式中删除它们。我想我可以在比赛中执行另一个正则表达式,但我真的想知道是否有更好的方法。

我的正则表达式

请记住,这个只匹配包含控制字符的标签。

<(([^>])*?`([^>])*?)*?>

非常感谢您的时间和考虑。

Iain Fraser

3 个答案:

答案 0 :(得分:2)

正则表达式不是此类工具,但您可以使用lookbehind和lookahead来匹配标记中的1。这是在Java中,修改为具有有限的lookbehind(因为Java不支持无限长度的lookbehind)。

    String s = "123 <o123o></o1o1> <oo 11='11x'> x11 <msg136='I <3 Johnny!11'>";
    System.out.println(
        s.replaceAll("(?<=<[^<>]{0,999})(?=[^<>]+>)1", "")
    ); // prints "123 <o23o></oo> <oo ='x'> x11 <msg136='I <3 Johnny!'>

在很多情况下,这会失败,但它应该让你从某个地方开始。

另见


好的,我已经“概括”了这个问题,因此它与HTML无关。这是一段Java代码,它使用正则表达式从[aeiou]<所包含的句子部分中删除>,其用法仅用于标记这些特殊部分。

当心:这个正则表达式绝对不可读。但是,是的,它有效。而且它也没有使用后视镜。

String s = "Wait <whaaat?> does this <really really> work???";
System.out.println(
    s.replaceAll("(?!>)(?:(?=<)|(?=\\G)(?!^))(?:(?:(?![aeiou])(.))|.)", "$1")
); // prints "Wait <wht?> does this <rlly rlly> work???"

可能尝试解释它是否有兴趣,但我建议使用这样的简单循环:

allocate output buffer
set isInside := false
for every character ch in input
   if (ch is openChar)
      isInside := true
   else if (ch is closeChar)
      isInside := false
   else if not (isInside and ch is control)
      append ch to buffer

答案 1 :(得分:1)

你通常不应该使用正则表达式来解析html - 但这不是开头的html,因此你不能使用解析器。以下似乎有效。

var s = "The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog";
while(s.match(/<[^>]*?1(?=[^>]*>)/))
  s = s.replace(/(<[^>]*?)1(?=[^>]*>)/g, "$1");
console.log(s); //"The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog"

答案 2 :(得分:0)

我知道你不是在“解析”它。但是你需要弄清楚什么是html标签,什么不是,这需要解析并且单独使用正则表达式不能管理它。

标签名称中控件字符的解决方案可能是使用有效的文本模式全局替换所有控件字符。

然后,您可以使用xml / html文档解析器解析生成的xml / html。然后,您可以运行此操作来执行搜索并替换标记名,属性名称,值。