【问题标题】:Get words from string - skip html从字符串中获取单词 - 跳过 html
【发布时间】:2016-05-16 07:23:20
【问题描述】:

我使用一个函数来获取字符串的前“x”个单词。主要部分是:

preg_match_all('/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER);

当一个单词在 html 中时 - 示例:

<a href="/"><u>Linktext</u></a>

正则表达式将单词“linktext”视为一个单词。正则表达式应更改为 skip html 标记内的每个单词。

这可能吗?

【问题讨论】:

  • 那么你想要html标签之外的所有文本吗?
  • @user2057781 试试这个(?&lt;!\&gt;)\b(&lt;\/?([\w+]+)[^&gt;]*&gt;)?([^&lt;&gt;]*)\b(?!\&lt;)
  • 请提供更多输入字符串。
  • 请在您的问题中提供更好/更多的输入样本以及您想要达到的目标。
  • 很遗憾,您提到的这个问题已被删除。您应该在此处的问题中提供完整的解释。

标签: php regex preg-match-all


【解决方案1】:

使用 XSL 转换。我使用了相关答案(How to remove all text from an XML document)中的模板:

$string = '<a href="/">Some text <u>Linktext</u> more text</a>';
$xslTemplate = '<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <!-- copy all nodes -->
  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- clear attributes -->
  <xsl:template match="@*">
    <xsl:attribute name="{name()}" />
  </xsl:template>
  <!-- ignore text content of nodex -->
  <xsl:template match="text()" />
</xsl:stylesheet>';

libxml_use_internal_errors(true);

$inputDom = new DOMDocument();
$inputDom->loadHTML($string);

$xslDom = new DOMDocument();
$xslDom->loadXML($xslTemplate);

$cp = new XSLTProcessor();
$cp->registerPHPFunctions();
$cp->importStylesheet($xslDom);

$transformedResult = $cp->transformToDoc($inputDom);
$transformedHtmlString = $transformedResult->saveXML($transformedResult->getElementsByTagName('body')->item(0));

$transformedHtmlString = str_replace('<body>','', $transformedHtmlString); //saveXml() method leaves automatically created body tag
$transformedHtmlString = str_replace('</body>','', $transformedHtmlString);
echo $transformedHtmlString;

【讨论】:

  • 我不想使用 strip_tags。我需要字符串中的 html。
  • 我现在看到了,看到更正的答案。还要注意 HEREDOC 封闭标签“XML;”这当然应该是代码的一部分。
  • 也许这听起来对你来说是转储,但我只有 php 文件来处理文本。当我将此 xml 代码添加到我的 php 文件时,我有语法错误
  • 这是因为我在上面的评论中提到的遗漏了 HEREDOC 封闭标签。我已将 HEREDOC 转换为纯字符串以避免不正确的解析器行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多