使用PHP

时间:2016-04-04 14:21:34

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

好的,首先,我不想用RegEx解析HTML。或者至少那不是我的一般目的。问题如下: 我有不同的语言文件,其中包含不同的字符串变量(不要介意编码,解决了特定情况下的问题)。我希望缩短到某个特定长度的一些变量,我想要保留HTML格式(例如字体,h1,强,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()函数中。我需要一个仅使用标记的开头部分的正则表达式模式(例如,将采用<font>但不会采用</font>)。任何帮助都表示赞赏,请不要因为整个&#34; regex-html&#34;而发誓。事情:))

1 个答案:

答案 0 :(得分:0)

假设我已正确阅读您的问题,您想要的正则表达式是<([^/>]+|br\s*\/)>。要打破它:

<与文字左角角色匹配。

(创建了一个组(在这种情况下捕获组,但这并不重要)。

[^/>]是一个否定的字符类,它将匹配任何字符但是正斜杠或结束角度字符。

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

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

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

\s匹配任何空格字符。

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

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

)关闭了小组。

>匹配文字的直角字符。

瞧瞧! <([^/>]+|br\s*\/)>匹配<font>但不匹配</font><h1>但不匹配</h1>,还<br />。 (感谢klaar指出最后一个)。