代码之家  ›  专栏  ›  技术社区  ›  Eoin

PHP如何从正文中删除某些属性

  •  0
  • Eoin  · 技术社区  · 6 年前

    我有以下变量 $text 这会激发出大量的HTML。其中大部分对我来说都没有用,但如果有的话。

    出来的HTML:

    <div class="feed-item-description">
    <ul>
    <li><strong>Impact:</strong>&nbsp;Low</li>
    <li><strong>Severity:</strong> <span class="label label-info">Low</span></li>
    </ul>
    ...
    

    我想做什么

    我想买 impact 以及 severity 这篇文章的评分。我不需要标签。

    我试过这样做:

    $itemAttributes = explode (':' , $text);
    
    $impact     = $itemAttributes[3];
    $severity   = $itemAttributes[4];
    

    这确实似乎给了我想要的属性,但它似乎也叫这个词后来。它的行为也很奇怪,即使我修剪它,我也无法从我的输出中去掉前面的空间。

    它似乎也关闭了 <div> 背后,我无法解释。我肯定我会被叫嚣使用Regex进行HTML,但我想一定有一种方法可以让事情变得如此简单,因为每次在我想要的信息之前,它都是相同的词。

    如果要查看页面上的实际输出,可以在此处看到: https://dev.joomlalondon.co.uk/ 在我生成的输出中可以看到它关闭了 <div class="feed-item-description"> 但我没有告诉它在任何地方都要这样做,我使用的输出包含在 <li> 不是一个 <分区> .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Emma    6 年前

    也许 吧,

    ^\h*(Impact:)\s+(.*)|^\h+(Severity:)\s+(.*)
    

    只需返回那些所需的值。

    测试

    $re = '/^\h*(Impact:)\s+(.*)|^\h+(Severity:)\s+(.*)/m';
    $str = 'Project: Joomla!
        SubProject: CMS
        Impact: Low
        Severity: Low
        Versions: 3.6.0 - 3.9.12
        Exploit type: Path Disclosure
        Reported Date: 2019-November-01
        Fixed Date: 2019-November-05
        CVE Number: CVE-2019-18674
    
    Description
    
    Missing access check in the phputf8 mapping files could lead to an path disclosure.
    Affected Installs
    
    Joomla! CMS versions 3.6.0 - 3.9.12';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    var_dump($matches);
    
    

    输出

    array(2) {
      [0]=>
      array(3) {
        [0]=>
        string(15) "    Impact: Low"
        [1]=>
        string(7) "Impact:"
        [2]=>
        string(3) "Low"
      }
      [1]=>
      array(5) {
        [0]=>
        string(17) "    Severity: Low"
        [1]=>
        string(0) ""
        [2]=>
        string(0) ""
        [3]=>
        string(9) "Severity:"
        [4]=>
        string(3) "Low"
      }
    }
    

    如果您希望简化/更新/探索表达式,将在 regex101.com . 您可以查看匹配的步骤或在中修改它们 this debugger link ,如果你感兴趣的话。调试器演示了 a RegEx engine 可能会逐步使用一些示例输入字符串并执行匹配过程。


    正则表达式电路

    jex.im 可视化正则表达式:

    enter image description here

        2
  •  0
  •   Nick SamSmith1986    6 年前

    因为你真的应该 DOMDocument 要解析HTML,下面是一个使用它的解决方案:

    $doc = new DOMDocument();
    $doc->loadHTML($html);
    $xpath = new DOMXPath($doc);
    $feed_items = $xpath->query('//div[contains(@class, "feed-item-description")]');
    foreach ($feed_items as $fi) {
        $impact_node = $xpath->query('//li[contains(string(), "Impact:")]', $fi);
        $impact = preg_replace('/Impact:\W*/', '', $impact_node->item(0)->textContent);
        echo $impact . "\n";
        $severity_node = $xpath->query('//li[contains(string(), "Severity:")]', $fi);
        $severity = preg_replace('/Severity:\W*/u', '', $severity_node->item(0)->textContent);
        echo $severity . "\n";
    }
    

    输出(用于示例HTML)

    Low
    Low
    

    Demo on dbfiddle

    推荐文章