好的,首先,我不想用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;而发誓。事情:))
答案 0 :(得分:0)
假设我已正确阅读您的问题,您想要的正则表达式是<([^/>]+|br\s*\/)>
。要打破它:
<
与文字左角角色匹配。
(
创建了一个组(在这种情况下捕获组,但这并不重要)。
[^/>]
是一个否定的字符类,它将匹配任何字符但是正斜杠或结束角度字符。
+
将匹配前一个令牌(否定的字符类)重复一次或多次。
|
的行为类似于布尔OR:匹配此模式或此模式。在这种情况下,匹配左表达式(非斜杠重复)或右表达式(br/
)。
br
匹配文字字符串“br”。
\s
匹配任何空格字符。
*
匹配前一个标记(空格)0次或更多次。
\/
匹配文字正斜杠字符。
)
关闭了小组。
>
匹配文字的直角字符。
瞧瞧! <([^/>]+|br\s*\/)>
匹配<font>
但不匹配</font>
,<h1>
但不匹配</h1>
,还<br />
。 (感谢klaar指出最后一个)。