我需要哪个正则表达式?

时间:2011-08-29 20:50:52

标签: php regex

我有点被困在这里 我有这种模式:
<a class="title" href="showthread.php?t=XXXXX" id="thread_title_XXX">DATADATA</a>
我知道在我的字符串(网页)中,我的所有数据都以这种格式存储,而它具有我刚写的“唯一签名”。 XXX的计数是动态的,可能在2到12个DIGITS之间(每个X是一个数字) 我可以写一个长表达式来找到整行,但我想提取数据,而不是整个数据。

我该怎么做 ?一个例子将不胜感激 谢谢!

3 个答案:

答案 0 :(得分:3)

忘记正则表达式,它们并不意味着解析像HTML这样的格式,特别是如果已存在actual parser

使用XPath找到节点:

$html = <<<EOT

<html>
Some html
<a class="title" href="showthread.php?t=XXXXX" id="thread_title_XXX">DATADATA</a>
</html>

EOT;

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//a[starts-with(@href, "showthread.php")]') as $node) {
    // ...
}

然后使用substrstrposparse_str提取数据:

$href = $node->getAttribute('href');
parse_str(substr($href, strpos($href, '?')+1), $query);
$t = $query['t'];

$id = $node->getAttribute('id');
$title = substr($id, strlen('thread_title_'));

$data = $node->nodeValue;

var_dump($t, $title, $data);

你得到:

string(5) "XXXXX"
string(3) "XXX"
string(8) "DATADATA"

答案 1 :(得分:3)

尝试使用:

 $parsed_str = '<a class="title" href="showthread.php?t=45343" id="thread_title_XXX">DATADATA</a><a class="title" href="showthread.php?t=466666" id="thread_title_XXX">DATADATA</a> fasdfasdfsdfasd gfgfkgbc  04034kgs <fdfd> dfs</fdfa> <a class="title" href="showthread.php?t=7777" id="thread_title_XXX">DATADATA</a>';
 preg_match_all("/.*?\?t\=([\d]{2,12}).*?/", $parsed_str, $result);
 print_r($result);

答案 2 :(得分:2)

你究竟想做什么?获取XXXXX签名或所有链接?

试试这个 - 这是一个签名和数据

<?php 
$S = '<a class="title" href="showthread.php?t=1234567" id="thread_title_XXX">DATADATA</a>';
$pattern = '!<a.*href="showthread.php\?t=(.*)".* id=".*">(.*)</a>!';

echo "<pre>";
print_r(preg_match($pattern, $S, $res));
print_r($res);
echo "</pre>";
?>