【问题标题】:PHP? Given two strings, display only the text between the given stringsphp?给定两个字符串,只显示给定字符串之间的文本
【发布时间】:2013-12-09 19:04:34
【问题描述】:

尝试为我的操作人员构建一个小型仪表板,以显示给定机场当前的 NOTAM 跑道表面状况 (RSC)。我们的运营需求可以而且确实会根据天气条件和跑道条件而发生变化。

不幸的是,发布 RSC 数据的机构对页面上的所有数据使用 DIV 的通用 ID、名称和类。所以我留下了所有的数据,甚至是我不想要的东西。

这是我当前的脚本,我在其中拉出包含数据的页面,然后隐藏所有可以隐藏的元素:

<script type="text/javascript" src="jquery-1.5.2.min.js"></script>
<script type="text/javascript">
$(function() {
    $("input.printcheckbox").remove();

    $("div#notam_station_whole_section").appendTo("div#NOTAMRSC");

    $("div#RAW").remove();
});
</script>

<?php

$str = file_get_contents("http://www.flightplanning.navcanada.ca/cgi-bin/Fore-    obs/ewx_traiter_notam.cgi?Recall=ni_File&Langue=anglais&TypeBrief=L&Rayon=50&Station=CYVR");

echo "<div id=\"RAW\">";

echo $str;

echo "</div>";

?>

<div id="NOTAMRSC"></div>

如果您自己运行脚本,我会留下一堆文本,而且几乎所有内容都无关紧要。

对于此示例,我正在尝试提取 CYXX(阿伯茨福德机场)的 RSC 数据,其中唯一相关的信息是以下文本:

CYXX RSC 01/19 100 PCT DRY SN TRACE. 1312091630
CYXX RSC 07/25 100 PCT DRY SN TRACE. 1312091630
RMK: TWY ALPHA, DRY SNOW 100 PCT TRACE  ALPHA 1, DRY SNOW 100 PCT 
TRACE  BRAVO, DRY SNOW 100 PCT TRACE  CHARLIE, DRY SNOW 100 PCT 
TRACE  CHARLIE 1, DRY SNOW 100 PCT TRACE  CHARLIE 4, DRY SNOW 100 
PCT TRACE  DELTA, DRY SNOW 100 PCT TRACE  GOLF, DRY SNOW 100 PCT 
TRACE
RMK: APN APRON I, DRY SNOW 100 PCT TRACE APRON RUN-UP, DRY SNOW 100 
PCT TRACE

我一直在尝试找出一种仅在 php 中提取此 ^^ 文本的方法,但由于所有 DIV 都是相同的,我似乎无法让任何 DOM 或 REGEX 工作。

我所追求的是一个脚本来显示两个给定字符串之间的所有文本,而忽略其余部分。

对于这个例子,第一个字符串是:

000000 CYXX ABBOTSFORD

对于任何机场,它总是在我正在寻找的 RSC 数据之前(在这种情况下,机场标识符为 CYXX,在这种情况下名称为“ABBOTSFORD”,正在更改)。

然后我想要的是在该字符串之后和下一个实例之前显示任何文本:

</pre>
</span></div>

这将允许我在扩展时将这个脚本用于未来的机场,只需更改第一个字符串以匹配新机场。

非常感谢任何和所有帮助。

【问题讨论】:

  • 尽管您建议“所有 DIV 都相同”。这是真的吗?它们在 DOM 层次结构中是否没有任何典型位置可用于确定所需数据的位置?
  • 我想要的所有数据都位于 DIV 中,都具有相同的 ID 和 CLASS。例如:&lt;div id="notam_bulletin" class="notam_print_section"&gt;,然后它们有一个checkbox 和一个span,它们也具有与所有其他相关数据相同的 ID。我能够稍微修改 Ed Cottrell 回答的内容,现在能够呈现我所追求的所有相关数据。 (直到网络开发人员决定再次更改他们的网站,不幸的是我找到了原始数据馈送)。

标签: php regex dom


【解决方案1】:

试试这个:

echo preg_replace('#(?s)^.*?000000\s+CYXX\s+ABBOTSFORD(.+?)</pre>\s*</span>\s*</div>.*$#', '\1', $str);

Debuggex Demo

解释:匹配直到000000 CYXX ABBOTSFORD 之前的所有内容,然后抓取所有内容(以非贪婪的方式)直到你点击&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;(有或没有空格),然后忽略其他所有内容直到最后。

请注意,您可以将CYXXABBOTSFORD 替换为您想要的任何内容。

编辑上面应该有\1

【讨论】:

  • 鉴于此脚本:&lt;?php $str = file_get_contents("http://www.flightplanning.navcanada.ca/cgi-bin/Fore-obs/ewx_traiter_notam.cgi?Recall=ni_File&amp;Langue=anglais&amp;TypeBrief=L&amp;Rayon=50&amp;Station=CYVR"); echo preg_replace('#(?s)^.*?000000\s+CYXX\s+ABBOTSFORD(.+?)&lt;/pre&gt;\s*&lt;/span&gt;\s*&lt;/div&gt;.*$#', '', $str); ?&gt; 我没有输出。
  • 这是什么意思?请注意,当我复制并粘贴您的代码时,我会得到很多乱码;我不确定那是关于什么的。
  • 您对\1 的更新似乎有效!极好的!非常感谢。
  • 老实说没想到会这么圆滑。在看到这里的潜力之后,如果可以的话,我有一个后续问题。如果我将代码更改为:echo preg_replace('#(?s)^.*?CYXX\s+ABBOTSFORD(.+?)&lt;/pre&gt;\s*&lt;/span&gt;\s*&lt;/div&gt;.*$#', '\1', $str); - 有没有办法重复此操作并显示所有带有 CYXX ABBOTSFORD“标题”的项目?目前它只会采取第一个实例,就是这样。你已经回答了我最初的请求,所以谢谢你,我只是想知道我们是否可以更进一步。再次感谢!
  • 查看preg_match_all()。例如,$matches = preg_match_all('#(?s)\bCYXX\s+ABBOTSFORD(.+?)&lt;/pre&gt;\s*&lt;/span&gt;\s*&lt;/div&gt;#', $str); 输出将是一个数组;执行var_dump($matches); 以查看其内容。您将需要 $matches[1] 中的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2016-12-19
  • 2021-04-14
  • 2015-07-21
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多