PHP?给定两个字符串,仅显示给定字符串之间的文本

时间:2013-12-09 19:04:34

标签: php regex dom

尝试为我的操作人员构建一个小仪表板,以显示给定机场的当前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>

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

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

1 个答案:

答案 0 :(得分:2)

试试这个:

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

Regular expression visualization

Debuggex Demo

说明:通过000000 CYXX ABBOTSFORD匹配任何内容和所有内容,然后抓住所有内容(以非贪婪的方式),直到您点击</pre></span></div>(有或没有空格),并忽略其他所有内容,直到结束。

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

编辑那应该有\1以上。