【问题标题】:Cut HTML Tags and wrap HTML tags again Part/1 [duplicate]剪切 HTML 标签并再次包装 HTML 标签 Part/1 [重复]
【发布时间】:2013-09-27 06:53:16
【问题描述】:

我尝试转换以下字符串

 <p>
     string
    <b>
      bold
        <em>italic string</em>
      also(bold)
    </b>
 </p>

到这个字符串

 <p>
     string
 </p> <!--------------------------------------- insert -->
    <b>
      bold
    </b> <!------------------------------------ insert -->
        <em>italic string</em>
     <b> <!------------------------------------ insert -->             
      also(bold)
    </b>
 <p> <!---------------------------------------- insert -->
 </p>

我知道这不是有效的 html,但我的项目需要它。 ...正则表达式是一个好方法,但我只是没有得到解决。

整个结构将是动态的,

我的想法是,正则表达式

// open tag close
$regex = '<(.*?)>(.*?)</(.*?)>'

if ($1 != $3) {
$newString = <$1>$2</$1></$3> 
}

但不工作!

【问题讨论】:

  • ...问题到底是什么?
  • 这个字符串是始终还是动态的?
  • @Rogue 我需要在打开或关闭另一个 TAG 之前插入动态的“TAG-Breakpoint”,该字符串必须转换为 istdynamic
  • 你知道parsing HTML with regex的危险吗?

标签: php html regex


【解决方案1】:

嗯,我认为有效的是两个连续的替换:

1.

^(\s*<(?!/))([^<]+)>(?=[^<]+\n)((?:(?!</\2>)[\s\S])*?)(?=\n *<)(?![^>]*</\2>)

替换为:

$1$2>$3\n$1/$2>

regex101 demo

2.

/[^>]+>$\n\K([^<>]*?)(^\s*)(?=</([^>]+)>)

替换为:

$2<$3>\n$1$2

regex101 demo

ideone render

我不知道为什么 ideone 将 &lt;&gt; 变成 &amp;lt;&amp;gt; 并且我不知道如何避免它:(

但这适用于您的示例。

【讨论】:

  • 感谢您的快速反馈,您正确的示例(请参阅)有效,但其他文本(有效 HTML)无效...示例:'

    string bold 斜体字符串(粗体)

    '
  • @FooLing 你能把它放在你的问题中吗?很难在评论中阅读:)
  • 我没有找到执行此操作的按钮 ;) 我的意思是 .. 您的正则表达式仅适用于我的示例,而不适用于另一个(有效的)HTML 字符串
  • @FooLing 我在第一个正则表达式上增加了一些保护措施。你能检查一下吗?
【解决方案2】:

如果你有一个静态字符串,那么你可以在 javascript 中这样做,

          htmlstring.replace("<b>","</p><b>")
                    .replace("<em>","</b><em>")
                    .replace("</em>","</em><b>")
                    .replace("</b>","</c-b>")
                    .replace("</b>","</b><p>")
                    .replace("</c-b>","</b>");

检查此http://jsfiddle.net/z5Aba/1/。 (需要检查控制台)

【讨论】:

  • 感谢您的反馈,但字符串不是静态的...它是动态生成的字符串
  • 您的意思是整个结构将是动态的,或者只是字符串部分,如stringbold ..
  • 整个结构将是动态的,我的想法是,正则表达式 .?)>(.)(*.?)> if $1 != $3 then $newString = $2$1>$3> 但不起作用!
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2021-04-04
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2023-03-13
相关资源
最近更新 更多