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

可以在当前父标签的每个子标签中映射标签的级联,像这样

来自:

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

到: 转换成这个字符串

  <p>
    string
  </p>

        <b p><!--------------------------------------- insert -->
          bold
        </b p><!--------------------------------------- insert -->

            <em b p>italic string</em b p><!----------- insert -->

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

   <p>
   </p>

jerry 回答了基本问题(第 1 部分) Cut HTML Tags and wrap HTML tags again Part/1

我认为正则表达式是我的朋友,在这种情况下也是如此:)

【问题讨论】:

  • Regex 在这里不是你的朋友。此外,“要求代码的问题必须证明对正在解决的问题有最低限度的了解。包括尝试过的解决方案、它们为什么不起作用以及预期的结果。”
  • &lt;em b p&gt;?你为什么要生成无效的 HTML?
  • @quentin,我知道这是无效的 HTML,但我自己的项目需要这个结构,这只是导入例程的中间步骤。
  • 我不知道您要编写什么样的导入例程,但我怀疑您完全不编写它会好很多。 PHP 有一个内置的 DOM 解析器,它可以将 HTML 加载到一组结构合理的对象中。我建议您了解一下,因为到目前为止您向我们描述的内容听起来会很糟糕。

标签: php html regex


【解决方案1】:

解决方案

来源

$page = '
<u>
str
<b>
bold
<em>
ital
<strike>
ic stri
</strike>
ng
</em>
also(bold)
</b>
</u>
<u>
str
<b>
bold
also(bold)
</b>
</u>
';

初始化变量 ...

$o = 'open';
$c = 'close';
$n = 'node';

$tag = null;
$tagName = null;
$addNode = null;
$strTmp = null;

grep 每一行 ...

foreach(preg_split("/((\r?\n)|(\r\n?))/", $page) as $line){
    $lines[] = $line;
}

替换逻辑...

for($i=0;$i<count($lines);$i++) {

    $line = $lines[$i];
    preg_match ('/<([^\/<]*?)>/' , $line, $open);
    preg_match ('/<(\/[^<]*?)>/' , $line, $close);

    $str = ""; 

    if($tag == $o ){

        if($addNode) {
            $str .= "#".$addNode."#";
        }
        $str .= $line;

        preg_match ('/<(\/[^<]*?)>/' , $lines[$i+1], $m);
        if(!strpos(@$m[1], $tagName)) {
            $addNode .= $tagName." ";
        }
    }

    if($tag == $c ){
        $str .= $line;
        $addNode = null;
    }

    if($tag == $n ){
        $str .= $line;
    }

    //$line = $addNode.$line;

    if(count($open)>0){$tag = $o; $tagName = $open[1];}
    if(count($close)>0){$tag = $c;}
    if(count($open)<1 && count($close)<1 ){$tag = $n;}

    $strTmp .= $str;

}

打印...

echo $strTmp = preg_replace('(<([\w]+)>#([^#]*)#)' , "<$1 $2>", $strTmp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2021-04-04
    • 2016-07-22
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多