我希望从下面的示例中获得t
558246017
值,例如$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>';
preg_match_all('/<a target="frameleft" href="Home.aspx?t=\d+">(.*?)<\/a>/si', $str, $matches);
print_r($matches);
preg_match_all函数无法正确执行。
{{1}}
请帮我解决这个问题。
答案 0 :(得分:3)
HTML不是常规语言,无法使用正则表达式进行可靠解析。我建议你使用DOM解析器。 PHP有一个内置类(DOMDocument
),擅长这些任务。使用HTML解析器而不是正则表达式的优点是,您始终可以确定结果。当标记的格式将来发生变化时,基于正则表达式的解决方案可能会中断,而基于DOM解析器的解决方案则不会。
您可以使用DOMDocument加载字符串并首先获取href
属性值。然后使用parse_url()
和parse_str()
获取所需的参数:
$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>';
$dom = new DOMDocument;
$dom->loadHTML($str);
foreach ($dom->getElementsByTagName('a') as $tag) {
$querystr = parse_url($tag->getAttribute('href'), PHP_URL_QUERY);
parse_str($querystr, $params);
echo $params['t'] . PHP_EOL;
}
输出:
558246017
答案 1 :(得分:2)
HTML不是常规语言,因此您should not use regular expressions to parse it。使用像DOMDocument
这样的DOM解析器。但是,为了学习,我会告诉你表达的错误。
但是,您的问题是?
是reserved character表示“可选”,.
是保留字符,表示任何字符。使用\
隐藏它们:
<a target="frameleft" href="Home\.aspx\?t=\d+">(.*?)<\/a>
此外,s
modifier表示点匹配换行符。因此,除非您希望链接中包含换行符,否则这是不必要的。
我也注意到你想要“t”值。目前,您对链接((.*?)
)的内容使用了capture group,而您想要捕获t(\d+
)的值。您需要将其修改为:
<a target="frameleft" href="Home\.aspx\?t=(\d+)">.*?<\/a>