【问题标题】:Regex - json fetch正则表达式 - json 提取
【发布时间】:2017-01-24 19:17:18
【问题描述】:

我尝试学习正则表达式,但很难快速学习,而且我遇到了问题。我在 laravel 中显示某种消息,如下所示:

B0679/17 NOTAMN Q) EPWW/QFALC/IV/NBO/A /000/999/5133N02154E005 A) EPDE B) 1701241325 C) 1701242100 E) AD CLSD FOR LDG and TKOF Due to Ice on RWY,TWY 和 APRON .

它是内联的,现在我想以如下格式显示它:

Q) EPWW/QFALC/IV/NBO/A /000/999/5133N02154E005 
A) EPDE 
B) 1701241325
C) 1701242100
E) AD CLSD FOR LDG AND TKOF DUE TO ICE ON RWY,TWY AND APRON. 

现在我的 PHP 看起来像这样:

<?php

$url = "http://api.vateud.net/notams/EPDE.json";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 4);
$json = curl_exec($ch);
if(!$json) {
    echo curl_error($ch);
}
curl_close($ch);
$obj= json_decode($json);

foreach($obj as $o=>$key){

    echo $key->raw . '<br />' ;
    echo '<br /><br />';
}
?>

【问题讨论】:

  • 您似乎忘记在问题中包含问题。
  • 我想在每个部分下显示 A) B) C) 的每个部分,因此 A) 在 A 下 B) 在 B C) 下。现在它显示我内联
  • 可以是数组
  • 你的 json 长什么样子?

标签: php json regex


【解决方案1】:

实际上,查看我看到的数据,其中已经包含回车符。当然,这些不会在 HTML 中显示,所以只需使用nl2br()

$data = json_decode(file_get_contents("http://api.vateud.net/notams/EPDE.json"));
foreach ($data as $obj) {
    echo nl2br($obj->raw);
}

另一种选择是使用&lt;pre&gt; 元素,它保留了该数据的用户可能习惯使用的等宽字体。这将打印出数据中已有的回车:

$data = json_decode(file_get_contents("http://api.vateud.net/notams/EPDE.json"));
foreach ($data as $obj) {
    echo "<pre>" . htmlspecialchars($obj->raw) . "</pre>";
}

我原来的正则表达式答案:

$data = json_decode(file_get_contents("http://api.vateud.net/notams/EPDE.json"));
foreach ($data as $obj) {
    echo preg_replace("/([A-Z]+\))/", "\n$1", $obj->raw) . "<br/>\n";
}

无论哪种情况,放弃复杂的 curl 废话,只需使用 file_get_contents()

【讨论】:

    【解决方案2】:

    如果我的理解正确,您正试图在每个 A) 等前面添加一些换行符。您可以使用以下正则表达式来查找每个出现的地方:

    [A-Z]\).*?(?=[A-Z]\)|$)
    
    • [A-Z] → 匹配从AZ 的每个大写字母
    • \) → 匹配 ) 字符,转义符号
    • .*? → 匹配任何字符 0 次或多次(但尽可能少)
    • (?=) → 序列的正向前瞻(必须在前一个选择器之后)
    • [A-Z]\)|$ → 匹配任何大字母后跟 ) 或字符串结尾

    这是一个 JavaScript 示例:

    var text = "B0679/17 NOTAMN Q) EPWW/QFALC/IV/NBO/A /000/999/5133N02154E005 A) EPDE B) 1701241325 C) 1701242100 E) AD CLSD FOR LDG AND TKOF DUE TO ICE ON RWY,TWY AND APRON.";
    var regex = /[A-Z]\).*?(?=[A-Z]\)|$)/g;
    
    console.log(text.match(regex));

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2016-09-09
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多