【问题标题】:Extract text outside html tags [closed]提取html标签外的文本[关闭]
【发布时间】:2018-12-22 13:27:05
【问题描述】:

我正在尝试使用preg_match() 提取文本,该文本不包含在<p><img> 等标签中。此文本是从数据库中检索的,我正在使用 PHP。

This should be extracted <p>I do not want this</p> This should be extracted <a>This may appear after other tags and I do not want this</a>

我尝试过(.*)(&lt;p&gt;|&lt;a&gt;|&lt;\/p&gt;|&lt;\/a&gt;)(.*),但这将捕获直到最后一个标签的所有内容,并且更早的标签与标签外的文本一起被捕获。

我曾尝试像这样在 Stackoverflow 上进行搜索: Match text outside of html tags 但是当我将它粘贴到 regex101.com 时,提供的正则表达式出现模式错误。

希望能提供任何帮助,谢谢。

【问题讨论】:

  • 最好使用DOM解析器,HTML的正则表达式总是脆弱的。
  • 为什么@barmar 是对的,请看这个问答:stackoverflow.com/a/1732454/870729
  • @Barmar 感谢您的回复。由于我的文本本身不是来自 html 或 xml 文件,而是来自数据库,因此它没有 body 或 head 标签。我检查了解析器是否使用 getElementsByTagName 访问节点,但我想要的文本不在标签中。有什么方法可以获取标签中没有的文本?
  • @claris 你是说你的数据库包含 HTML 标记标签吗?
  • @Funk Forty Niner 是的,不幸的是,由于我正在处理遗留系统,数据库包含 HTML 标记。

标签: php regex


【解决方案1】:

您可以使用 PHP 的 DOMDocumentDOMXPath 来获取您想要的值。诀窍是将数据库中的 HTML 包装在(例如)&lt;div&gt; 标记中,然后您可以将其加载到 DOMDocument 并使用 DOMXPath 搜索 &lt;div&gt; 标记的子级,这些子级纯粹是使用text() 路径的文本:

$html = 'This should be extracted <p>I do not want this</p> This should also be extracted <a>This may appear after other tags and I do not want this</a>';
$doc = new DOMDocument();
$doc->loadHTML("<div>$html</div>", LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($doc);
$texts = array();
foreach ($xpath->query('/div/text()') as $text) {
    $texts[] = $text->nodeValue;
}
print_r($texts);

输出:

Array ( 
    [0] => This should be extracted
    [1] =>  This should also be extracted 
)

Demo on 3v4l.org

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2021-10-22
    • 2011-10-15
    • 2015-10-22
    相关资源
    最近更新 更多