【问题标题】:Find any open, but not closed HTML tags with PHP使用 PHP 查找任何打开但未关闭的 HTML 标记
【发布时间】:2016-07-24 03:36:17
【问题描述】:

好的,首先,我不想用 RegEx 解析 HTML。或者至少这不是我的一般目的。问题如下: 我有不同的语言文件,其中包含不同的字符串变量(不要介意编码,该特定情况下的问题已解决)。我想缩短到特定长度的一些变量,具有我想保留的 HTML 格式(例如字体、h1、strong、a 等。听起来像标准情况,已经解决但我面临一个大问题自己解决)。如果你还在阅读,恭喜!我解决问题的方法完全不同,我运行了一个while循环,遍历整个文本并计算<>之外的所有字符。代码如下:

function shorten($text, $length = 1000, $ellipsis= '...', $html = true) {
    $tagsUsed = array('font', 'b', 'a', 'sub', 'sup');
    $xhtmlTags = array('br');
    $openTags = array();
    $closedTags = array();
    $inTag = false;
    $tagName = "";

    $i = 0;
    $cntr = 0;

    $truncatedStr = "";

    while($cntr < $length){
    $truncatedStr .= $text[$i];

        switch($text[$i]){

            case "<":
                $inTag = true;
                break;

            case ">":
                $inTag = false;
                break;

            default: 
                if($inTag == false){
                    $cntr++;
                }
        }

        $i++;
    }

    preg_match_all("/(<\/?([\w+]+)[^>]*>)?([^<>]*)/", $truncatedStr, $tags);

    foreach ($tags[2] as $tag) {
        if(!in_array($tag, $xhtmlTags)){
            array_push($openTags, $tag);
        }
    }

    return $truncatedStr.$ellipsis;
}

一切都很好。我们的翻译团队知道要使用哪些 html 标签,这是最重要的部分:这与发布 html 的用户无关,我们要清理。问题出在preg_match_all() 函数中。我需要一个只占用标签开头部分的正则表达式模式(例如,将采用&lt;font&gt;,但不会采用&lt;/font&gt;)。任何帮助表示赞赏,请不要因为整个“regex-html”而发誓:)

【问题讨论】:

    标签: php html regex preg-match-all truncate


    【解决方案1】:

    假设我已正确阅读您的问题,您想要的正则表达式是&lt;([^/&gt;]+|br\s*\/)&gt;。分解:

    &lt; 匹配文字左角字符。

    ( 创建一个组(在这种情况下是捕获组,但没关系)。

    [^/&gt;] 是一个否定字符类,它将匹配除正斜杠或结束角字符之外的任何字符。

    + 将匹配重复一次或多次的前一个标记(否定字符类)。

    | 的行为类似于布尔 OR:匹配此模式或此模式。在这种情况下,匹配左侧表达式(非斜线重复)或右侧表达式(br/)。

    br 匹配文字字符串“br”。

    \s 匹配任何空白字符。

    * 匹配前一个标记(空格)0 次或多次。

    \/ 匹配文字正斜杠字符。

    ) 关闭群组。

    &gt; 匹配直角字符。

    瞧! &lt;([^/&gt;]+|br\s*\/)&gt; 匹配 &lt;font&gt; 但不匹配 &lt;/font&gt;&lt;h1&gt; 但不匹配 &lt;/h1&gt; 以及 &lt;br /&gt;。 (感谢 klaar 指出最后一个)。

    【讨论】:

    • 但是
      呢?从技术上讲,这就是 XHTML,所以你已经被覆盖了,但仍然如此。
    • &lt;br&gt;(对于 XML 上瘾者可选 /),&lt;img&gt;&lt;meta&gt;&lt;link&gt;&lt;p&gt; 和许多其他元素可以或必须有一个开始标签,但没有结束标签,仍然可以正确关闭。
    • @Quentin:如果 OP 只关心标签而不关心标签的内容,那么这不会造成问题。但是,如果他这样做......疯狂!
    • 我真的不知道 :) 此外,我有一个单独的 array() 用于 xhtml 标签。它们不会打扰我,因为它们在缩短后无法“保持开放”。
    • 但该模式不会返回任何内容。我不知道为什么。在正则表达式方面,我是一个真正的菜鸟,所以请原谅,但是 $tags 变量是空的。
    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2022-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多