You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 11.5.16:如何分离文本内容元素的标题与正文?

解决方案:TYPO3中单独提取文本内容元素的标题与正文

针对你的需求,有几种可靠的方式实现从单个文本内容元素中分别提取标题和正文,以下是具体方案:

方案一:使用VHS扩展(推荐)

VHS是TYPO3生态中广泛使用的实用扩展,提供了丰富的视图助手工具,其中v:html.extract可以直接通过CSS选择器提取HTML内容:

  1. 安装VHS扩展:在TYPO3后台的扩展管理器中搜索并安装vhs扩展
  2. 在流体模板中提取内容:
    • 提取标题(匹配<h2>标签内容):
      {contentXY -> v:html.extract(selector: 'h2')->f:format.raw()}
      
    • 提取正文(匹配<p>标签内容):
      {contentXY -> v:html.extract(selector: 'p')->f:format.raw()}
      

方案二:自定义流体视图助手(无需额外扩展)

如果不想安装第三方扩展,可以自己编写一个简单的视图助手来解析HTML:

  1. 创建视图助手类:在你的自定义扩展的Classes/ViewHelpers目录下新建ExtractHtmlViewHelper.php:
    <?php
    namespace YourVendor\YourExtension\ViewHelpers;
    
    use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
    use Symfony\Component\DomCrawler\Crawler;
    
    class ExtractHtmlViewHelper extends AbstractViewHelper
    {
        public function initializeArguments()
        {
            $this->registerArgument('selector', 'string', 'CSS选择器', true);
        }
    
        public function render()
        {
            $html = $this->renderChildren();
            $crawler = new Crawler($html);
            $elements = $crawler->filter($this->arguments['selector']);
            return $elements->count() ? $elements->html() : '';
        }
    }
    
  2. 在模板中使用自定义视图助手:
    • 提取标题:
      {contentXY -> yourvendor.extractHtml(selector: 'h2')->f:format.raw()}
      
    • 提取正文:
      {contentXY -> yourvendor.extractHtml(selector: 'p')->f:format.raw()}
      

方案三:通过TypoScript处理

也可以在TypoScript层面完成内容提取,适合需要在全局统一处理的场景:

提取标题

lib.contentTitle = CONTENT
lib.contentTitle < styles.content.get
lib.contentTitle {
    renderObj = COA
    renderObj {
        10 = TEXT
        10 {
            value = {field:bodytext}
            parseFunc =< lib.parseFunc_RTE
            regex = /<h2[^>]*>(.*?)<\/h2>/is
            regex.replace = $1
        }
    }
}

模板中调用:

{lib.contentTitle -> f:format.raw()}

提取正文

lib.contentBody = CONTENT
lib.contentBody < styles.content.get
lib.contentBody {
    renderObj = COA
    renderObj {
        10 = TEXT
        10 {
            value = {field:bodytext}
            parseFunc =< lib.parseFunc_RTE
            regex = /<header[^>]*>.*?<\/header>(.*)/is
            regex.replace = $1
        }
    }
}

模板中调用:

{lib.contentBody -> f:format.raw()}

注意事项

  • 确保文本内容元素的HTML结构固定(比如标题始终用<h2>、正文在<p>标签内),避免提取失效
  • 优先选择VHS扩展或自定义视图助手的DOM解析方式,比正则表达式更稳定,能应对HTML结构的微小变化

内容的提问来源于stack exchange,提问作者SIMTEC Software Solutions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:15:41