【发布时间】: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() 函数中。我需要一个只占用标签开头部分的正则表达式模式(例如,将采用<font>,但不会采用</font>)。任何帮助表示赞赏,请不要因为整个“regex-html”而发誓:)
【问题讨论】:
标签: php html regex preg-match-all truncate