【问题标题】:Get text between 2 tags that change (regex)(php)获取 2 个更改的标签之间的文本(正则表达式)(php)
【发布时间】:2016-06-29 10:45:22
【问题描述】:

我应该如何获取两个并不总是相同的 html 标签之间的文本。我应该如何让正则表达式“忽略”一部分。

假设这是我的 html:

<html>
...
<span id="ctl00_ContentPlaceHolder1_gvDomain_ctl03_lblName">stirng 1</span>
...
<span id="ctl00_ContentPlaceHolder1_gvDomain_ctl04_lblName">string 2</span>
...
<span id="ctl00_ContentPlaceHolder1_gvDomain_ctl53_lblName">string 3</span>
...
</html>

正如你看到的 ctlxx 部分并不总是一样的,这段代码只获取第一个字符串:

preg_match('#\\<span id="ctl00_ContentPlaceHolder1_gvDomain_ctl03_lblName">(.+)\\</span>#s',$html,$matches);
$match = $matches[0];
echo $match;

如何让正则表达式忽略 ctlxx 部分并回显所有字符串?

提前致谢

【问题讨论】:

  • 你想回显 span 标签的值吗?
  • 没有span标签之间的字符串,所以在这种情况下:字符串1,字符串2,字符串3
  • 您可以使用 javascript 。 getElementById("id").innerHTML 会给你内容

标签: php html regex


【解决方案1】:

你可以通过 DomDocument 和 DomXpath 使用 preg_match 来做到这一点

$dom = new DOMDocument();
$dom->loadHTML($str);

$x = new DOMXpath($dom);

// Next two string to use Php functions within within Xpath expression  
$x->registerNamespace("php", "http://php.net/xpath");
$x->registerPHPFunctions();

// Select span tags with proper id
foreach($x->query('//span[php:functionString("preg_match", "/ctl00_ContentPlaceHolder1_gvDomain_ctl\d+_lblName/", .)]') as $node) 
    echo $node->nodeValue;

【讨论】:

    【解决方案2】:

    如果你想使用正则表达式来解决它,那么你可以这样做

    <?php
        preg_match('/<span id="[^"]*">(.+)<\/span>/is',$html,$matches);
        $match = $matches[0];
        echo $match;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多