【问题标题】:PHP - echo the opening and closing of tags from arrayPHP - 回显数组中标签的打开和关闭
【发布时间】:2018-07-14 14:31:12
【问题描述】:

这里我有一个数组,里面有内容,它们是一个对象、两个或更多——取决于所需的标签;嵌套在多维数组中的第一个元素将是文本输出,除非它是一个数组,否则数组中的第一个元素将是文本。

但是数组中的其他内容是引用了它们对应的HTML标签,如:

    [1] => Array
    (
        [0] => bo          <====== Text to output
        [1] => bold        <====== tag to be within
    )

但是,在简单的模块中,我希望内容不要不断重复此类响应,例如:

This is a test <b>bo</b><i><b>ld</b></i><i>,</i> <u><i>u</i></u><u>nderline</u> ...

输出应该是:

This is a test<b>bo<i>ld</i></b><i>, <u>u</u></i><u>nderline</u> ...

这是我目前拥有的 PHP 代码...

$use = array();
$base = "";
foreach ($build as $part => $data) {
//  print_r($use);
    if(!is_array($data)){
        $base .= $data;
    } else {
        $text = array_shift($data);
        if(!is_array($data[0])){
            $data = array($data[0]);
        } else {
            $data = $data[0];
        }
        $removed = array_diff($use,$data);

        foreach (($data) as $tag) {
            if (in_array($tag, array_diff($use,$data))) {
                $base .= "<\/" . $tag . ">";
            } elseif(!in_array($tag, $use)){
                $base .= "<" . $tag . ">";
                array_push($use, $tag);
            }
        }
        $use = $data;
        $base .= $text; 
    }
}
print_r($base);

如果需要,这里是数组(JSON 格式!):

["This is a test\nIncluding ",["bo","bold"],["ld",["italic","bold"]],[", ","italic"],["u",["underline","italic"]],["nderlined","underline"],", ",["strike-through","strike"],", and ",["italic","italic"],"\ntext:\n\n",["numbered lists",["underline","strike","italic","bold"]],["\n",[]],"as well as",["\n",[]],["non ordered lists","http:\/\/test.com"],["\n",[]],"it works very well",["\n",[]],["try it","http:\/\/google.com"],"\n",["http:\/\/google.com",["bold","http:\/\/google.com"]],"\n\n",["wow","bold"],"\n",["lol","bold"]]

任何帮助将不胜感激...谢谢!

【问题讨论】:

  • 您可以使用 document.createElement() 使用 JavaScript 来完成此操作,我相信这会容易得多...真的必须使用 PHP 来完成吗?
  • @Zeke 遗憾的是,它确实必须在 PHP 中完成,以使所有内容尽可能快地显示内容,如果您对如何在 PHP 中执行此操作有任何想法,将不胜感激 -因为我一直在努力解决这个问题 8 小时......
  • 好的,我问是因为您以 JSON 格式提供了数组,这表明 JavaScript 是要走的路……但可以肯定。 PHP 脚本采用 JSON 格式的数组?我的意思是,它必须首先被解码,对吗? (我想这是你的$build 变量)
  • @zeke 是正确的(我把它放在 JSON 格式,我认为人们将 JSON 加载到 PHP 中进行测试会更容易)

标签: php html arrays json html-parsing


【解决方案1】:

老实说,我不确定这是否正是您想要的。有一个完整的期望输出会很棒......但我相信这是尽可能接近的。我花了3个小时,所以最好是这样。这是一个很好的问题,很难完成。

我做了print_r(htmlentities($base)),但你可以简单地做print_r($base) 来查看格式化的结果。我这样做是因为更容易检查您在问题中提供的输出。

另外,我修改了您的 JSON,因为那里指定的一些标签不存在。例如,我将underline 更改为u,将italic 更改为i,将bold 更改为b。替代方案是emstrong...无论如何,这只是一个旁注。

<?php
$build = json_decode('["This is a test\nIncluding ",["bo","b"],["ld",["i","b"]],[", ","i"],["u",["u","i"]],["nderlined","u"],", ",["strike-through","strike"],", and ",["italic","i"],"\ntext:\n\n",["numbered lists",["u","strike","i","b"]],["\n",[]],"as well as",["\n",[]],["non ordered lists","http:\/\/test.com"],["\n",[]],"it works very well",["\n",[]],["try it","http:\/\/google.com"],"\n",["http:\/\/google.com",["b","http:\/\/google.com"]],"\n\n",["wow","b"],"\n",["lol","b"]]', true);
$used = [];
$base = '';
foreach($build as $data){
    if(is_array($data)){
        $text = array_shift($data);
        $tags = $data[0];
        if(!is_array($data[0])){
            $tags = [$data[0]];
        }
        $elements = '';
        $tagsToClose = array_diff($used, $tags);
        $changes = true;
        $i = 0;
        foreach($tagsToClose as $tag){
            while($changes){
                $changes = false;
                if($lastOpened != $tag){
                    $changes = true;
                    $elements .= '</'.$lastOpened.'>';
                    unset($used[$i++]);
                    $lastOpened = $used[$i];
                }
            }
            $elements .= '</'.$tag.'>';
            $key = array_search($tag, $used);
            unset($used[$key]);
        }
        foreach($tags as $tag){
            if(!in_array($tag, $used)){
                $elements .= '<'.$tag.'>';
                array_unshift($used, $tag);
                $lastOpened = $tag;
            }
        }
        $elements .= $text;
        $data = $elements;
    }
    $base .= $data;
}
unset($used);
$base .= '</'.$lastOpened.'>';
print_r(htmlentities($base));
?>

编辑

这是我得到的结果,以防万一您在测试时遇到问题或检查您的结果或其他什么:

This is a test Including &lt;b&gt;bo&lt;i&gt;ld&lt;/i&gt;&lt;/b&gt;&lt;i&gt;, &lt;u&gt;u&lt;/u&gt;&lt;/i&gt;&lt;u&gt;nderlined, &lt;/u&gt;&lt;strike&gt;strike-through, and &lt;/strike&gt;&lt;i&gt;italic text: &lt;u&gt;&lt;strike&gt;&lt;b&gt;numbered lists&lt;/b&gt;&lt;/strike&gt;&lt;/u&gt;&lt;/i&gt; as well as &lt;http://test.com&gt;non ordered lists&lt;/http://test.com&gt; it works very well &lt;http://google.com&gt;try it &lt;b&gt;http://google.com &lt;/b&gt;&lt;/http://google.com&gt;&lt;b&gt;wow lol&lt;/b&gt;

【讨论】:

  • 你检查过我的答案吗?我花了很多时间来做这件事,而你已经 6 天没说一句话了。现在你有一个出乎意料的答案?如果你看不到答案,问这个问题有什么意义?
  • 好吧,你本可以在这里评论说你绕过了这个问题,同时对我的回答发表了一些看法,即使它是否定的,尤其是因为我不确定我是否提供了一点帮助。我没有生气,但感觉你完全忽略了我的回答。
  • 如果冒犯了你,我很抱歉
  • 不,一点也不,一切都很好。但说真的,不要只是在发布另一个答案 7 天后添加一个答案,而不是在第一个答案上说任何话。这很粗鲁(因为显然问了这个问题)。
  • 好吧,对不起,我认为我确实验证了它是正确的答案...
【解决方案2】:

几个小时后,这是我最终得到的解决方案:

$build = json_decode('["This is a test Including\u00a0",["bo","bold"],["ld",["italic","bold"]],[",\u00a0","italic"],["u",["underline","italic"]],["nderlined,\u00a0","underline"],"strike-through, and\u00a0",["italic text:\u00a0","italic"],"it works very well\u00a0try it\u00a0",["http:\/\/google.com",["bold","http:\/\/google.com"]],["\u00a0wow lol","bold"]]',true);
$standard = array("bold"=>"b","underline"=>"u","strike"=>"s","italic"=>"i","link"=>"a","size"=>null);
$lists = array("ordered"=>"ol","bullet"=>"ul");
$size = array("huge"=>"2.5em","large"=>"1.5em");

$base = "";
foreach($build as $part){
    $use = array();
    $tags = true;
    $len = 1;
    if(!is_array($part) or count($part) == 1){
        $text = $part;
        $tags = false;
        $part = array();
    } else {
        $text = array_shift($part);

        if(count($part) == 1){
            if(is_array($part[0])){
                $part = $part[0];
            }
        }
        if(!is_array($part)){
            $part = array($part);
        }
    }
    if($tags){
        foreach ($part as $tag) {
            if(!in_array($tag, array_keys($standard)) && !in_array($tag, array_keys($lists)) && !in_array($tag, array_keys($size))){
                $base .= '<a href="' . $tag . '" title="' . $tag . '" class="link">';
                $tag = "link";
            } elseif(in_array($tag, array_keys($size))){
                $base .= "<span style='font-size:" . $size[$tag] . "'>";
            } elseif(!in_array($tag, array_keys($lists))) {
                $base .= "<" . $standard[$tag] . ">";
            }
            array_push($use, $tag);
        }
        $base .= $text;
        foreach (array_reverse($part) as $tag) {
            if(!in_array($tag, array_keys($standard)) && !in_array($tag, array_keys($lists)) && !in_array($tag, array_keys($size))){
                $base .= '</a>';
            } elseif(in_array($tag, array_keys($size))){
                $base .= "</span>";
            } elseif (!in_array($tag, array_keys($lists))) {
                $base .= "</" . $standard[$tag] . ">";
            }
            array_push($use, $tag);
        }
    } else {
        $base .= $text;
    }
}
print_r($base);

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多