【问题标题】:Detect text between some tags检测一些标签之间的文本
【发布时间】:2011-02-06 14:13:28
【问题描述】:

我正在尝试检测 3 或 4 个标签之间的文本,但我不知道如何 - 使用 PHP。 我知道我应该使用正则表达式,但这对我来说太难了:X

如果你能解释我该怎么做/给我举例说明我需要什么,那就太好了!

我正在尝试检测 <script> 标签之间的代码 > 这意味着如果我得到 <script type="text/javascript"> 它也会检测到。如果有<script src="...">,那么它不会检测到中间的文本(不应该是中间的文本)。

与脚本相同 ^ 如果有 <style type="text/css"> 它也会检测到文本之间的文本

我还想检测 style="detect text here" artitube 之间的文本。

我要在其间发送文本的最后一个标签是<?php ?>。 (php也可以大写,所以我不希望正则表达式区分大小写)。

感谢大家的帮助!!!

【问题讨论】:

  • 不,你不应该使用正则表达式。
  • 为此使用正则表达式有什么问题?
  • @Kaltas:这只是 Stackoverflow 上的一个梗。人们混淆了解析和提取,没有客观地衡量用例和潜在问题。 (因此,当 HTML 成为主题时,请小心提及它。但对于其他结构化语言,它通常会被忽视。)
  • 我明白了——每个问题都需要仔细评估。
  • @Kaltas:是的,这也是一个糟糕的模因,@SLaks 不应该传播,其他任何人也不应该传播。正则表达式非常适合驯服 ᴀᴋᴀ 俘虏 ᴀᴋᴀ 有限 ᴀᴋᴀ 已知 HTML 字符串。只有 完全 开放式 HTML,尤其是在您拥有整个网页的情况下,才会这样做become rather more difficult — but still not impossible。请注意,该链接试图说服人们使用正则表达式进行完整的解析/提取;每个人都读错了那个帖子。

标签: php regex tags


【解决方案1】:

使用正则表达式,您可以编写如下内容:

<?php
$html = <<<EOF
<script type="text/javascript">
    function xyz() { alert('some alert'); }
</script>
EOF;

preg_match('/<script.*>(.*)<\/script>/sU', $html, $matches);

var_dump($matches)
?>

【讨论】:

  • 适用于
  • 这是肯定的 - 这只是从哪里开始的一个快速示例。如果您有兴趣,我可以详细说明。
  • 是的,请!顺便说一句,我试过 preg_match('/style="(.*)"/sU', $html, $matches);检测样式 artitube 之间的文本,它工作了一半 oO 想在这里检测文本 > style="gfhfgh" 所以我使用我的正则表达式做了 foreach ($matches as $line) ,我得到了 2 行 - 1 行 style="gfhfgh"和一个gfhfgh。奇怪的oO
  • 如果您查看文档,您会发现 $matches 总是看起来像这样 - 您总是在 $matches[0] 处获得与完整模式匹配的文本,并在下一个索引中获得匹配的子模式.
  • 好的,谢谢,那么我的正则表达式是对的 :D, 这个不能正常工作 > preg_match('//sU ', $html, $matches);我很确定我需要在 ? (问号)
【解决方案2】:

正则表达式并不是最适合解析 HTML。有充分的理由,请参阅问题Can you provide some examples of why it is hard to parse XML and HTML with a regex?

您可以更轻松地将 HTML 加载到 DOM XML 类中,然后您可以执行 XPath 查询来提取您想要的标签。

例如,尝试这样的方法来获取所有没有 src 属性的 &lt;script&gt; 标签...

$doc = new DOMDocument();
$doc->loadHTMLFile("myfile.html");

$xpath=new DOMXPath($doc);

//find script elements which don't have a src attribute
$scriptNodes=$xpath->query("script[not(@src)]");
foreach ($scriptNodes as $scriptNode) {

    //do something here...

}

【讨论】:

  • 如果不是有效的 HTML 怎么办?
  • HTML 支持应该是相当宽容的,但你只需要尝试一下。
  • 保罗:这是真的,但它不是 100% 安全的。但是,如果它在这种特殊情况下有效,那么您的方法肯定比正则表达式更好。
  • 这是 myfile.html 中的代码 > test 使用您的代码来检测 script 标签和回应它,它没有用..我错过了什么吗?
  • @Ron:如果这就是您的 HTML 的全部内容,那么正则表达式可以轻松处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2014-03-27
  • 2013-05-04
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多