【问题标题】:preg_replace is replacing everythingpreg_replace 正在替换一切
【发布时间】:2014-04-19 04:58:05
【问题描述】:

我想用空字符串替换某些 html 标记并且只想检索文本。下面是我想要的例子。

preg_match_all("/<span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">(.*)<\/span>/U", $content, $matches);

上面的行检索到这样的东西。

<span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>

现在,我只想检索整数值(即 50)。我尝试了以下语句来删除 HTML 标签。

    foreach($matches[0] as $key=>$val) {
        $price = preg_replace( '/<(.*)>/', '', $val);
    }

但问题是,它替换了所有内容,并返回了一个空字符串。它应该返回 50,而不是 null。输出文件 $price 变量应该是这样的:

$price = 50

【问题讨论】:

    标签: php regex html-parsing preg-replace


    【解决方案1】:

    尝试在正则表达式中添加问号

    foreach($matches[0] as $key=>$val) {
      $price = preg_replace( '/<(.*?)>/', '', $val);
    }
    

    这将产生找到第一个&gt; 而不是最后一个的效果。正则表达式是贪婪的,它会找到它所能找到的一切。

    另外,请记住,您执行此操作的方式将用每个循环替换 $price。我假设你在下一个循环发生之前用 $price 做一些事情,但如果没有,你应该将价格存储在一个数组中。

    【讨论】:

      【解决方案2】:

      如果它的匹配似乎超出预期,请使用? 进行非贪婪匹配。贪婪 (.*) 将尽可能多地消耗,而使其非贪婪 (.*?) 将防止这种情况发生。

      preg_replace('/<(.*?)>/', '', $val);
      

      我也会考虑使用DOM,下面是一个例子。

      $content = <<<DATA
      <span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>
      <span id="priceblock_ourprice" class="a-size-medium a-color-price">40</span>
      <span id="foo">30</span>
      DATA;
      
      $doc = new DOMDocument();
      $doc->loadHTML($content); // Load your HTML content
      
      $xpath = new DOMXPath($doc);
      $vals = $xpath->query("//span[@id='priceblock_ourprice']");
      
      foreach ($vals as $val) {
         echo $val->nodeValue . "\n";
      }
      

      输出

      50
      40
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2014-06-10
        • 2018-02-27
        • 1970-01-01
        • 2011-01-24
        • 2015-08-09
        相关资源
        最近更新 更多