在html代码中提取两个字符串

时间:2015-04-14 15:05:20

标签: php dom xpath

我有一个HTML表格,其结构如下:

<tr>
    <td class='tablesortcolumn'>atest</td>
    <td >Kunde</td>
    <td ><a href="">email@example.com</a></td>
    <td align="right"><a href="module/dns_reseller/user_edit.php?ns=3&uid=6952"><img src="images/iconedit.gif" border="0"/></a> <img src="images/pixel.gif" width="2" height="1" border="0"/> <a href="module/dns_reseller/user.php?delete=true&uid=6952" onclick="return confirm('Möchten Sie den Datensatz wirklich löschen?');"><img src="images/icontrash.gif" border="0"/></a></td>
</tr>

这些tr块有数百个。

我想提取atestemail@example.com

我尝试了以下内容:

$document = new DOMDocument();
$document->loadHTML($data);
$selector = new DOMXPath($document);
$elements = $selector->query("//*[contains(@class, 'tablesortcolumn')]");

foreach($elements as $element) {
  $text = $element->nodeValue;
  print($text);
  print('<br>');
}

提取atest没问题,因为我可以使用tablesortcolumn类获取元素。我怎样才能收到电子邮件地址?

我不能简单地使用//table/tr/td/a因为网站上有其他元素是这样构造的。所以我需要通过选择一个空的href标签来获得它。我已经尝试了//table/tr/td/a[contains(@href, '')],但它返回与//table/tr/td/a

相同的内容

有没有人知道如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

你可以尝试运行包含字符串@的xpath吗?这似乎不太可能用于其他任何事情。

这样的事情可能会起作用

//*[text()[contains(.,'@')]]

答案 1 :(得分:1)

如果您要查找电子邮件字段,可以使用正则表达式。 Here是一篇可能有用的文章。

修改

根据NisseEngström的说法,我将把文章的有趣部分放在这里,以防博客失败。谢谢你的建议。

// Supress XML parsing errors (this is needed to parse Wikipedia's XHTML)
libxml_use_internal_errors(true);

// Load the PHP Wikipedia article
$domDoc = new DOMDocument();
$domDoc->load('http://en.wikipedia.org/wiki/PHP');

// Create XPath object and register the XHTML namespace
$xPath = new DOMXPath($domDoc);
$xPath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');

// Register the PHP namespace if you want to call PHP functions
$xPath->registerNamespace('php', 'http://php.net/xpath');

// Register preg_match to be available in XPath queries 
//
// You can also pass an array to register multiple functions, or call 
// registerPhpFunctions() with no parameters to register all PHP functions
$xPath->registerPhpFunctions('preg_match');

// Find all external links in the article  
$regex = '@^http://[^/]+(?<!wikipedia.org)/@';
$links = $xPath->query("//html:a[ php:functionString('preg_match', '$regex', @href) > 0 ]");

// Print out matched entries
echo "Found " . (int) $links->length . " external linksnn";
foreach($links as $linkDom) { /* @var $entry DOMElement */
    $link = simplexml_import_dom($linkDom);
    $desc = (string) $link;
    $href = (string) $link['href'];

    echo " - ";
    if ($desc && $desc != $href) {
        echo "$desc: ";
    } 
    echo "$href\n";
}

答案 2 :(得分:1)

以下XPath表达式完全符合您的要求

//*[@class = 'tablesortcolumn' or contains(text(),'@')]

使用您显示的输入文档将产生(单个结果由-------------分隔):

<td class="tablesortcolumn">atest</td>
-----------------------
<a href="">email@example.com</a>

答案 3 :(得分:0)

如果您使用的是Chrome,则可以在控制台中测试XPath查询,如下所示:

$x("//*[contains(@class, 'tablesortcolumn')]")