1

我正在使用 php,我在解析带有文本的锚标记中的 href 时遇到问题。

示例:具有测试的锚标记http://www.test.com

像这样<a href="http://www.test.com" title="test">http://www.test.com</a>

我想匹配锚标记中的所有文本

提前致谢。

4

3 回答 3

6

使用DOM

$text = '<a href="http://www.test.com" title="test">http://www.test.com</a> something else hello world';
$dom = new DOMDocument();
$dom->loadHTML($text);

foreach ($dom->getElementsByTagName('a') as $a) {
    echo $a->textContent;
}

DOM 专门设计用于解析 XML 和 HTML。它将比您想出的任何正则表达式解决方案更强大。

于 2010-07-29T10:10:07.363 回答
-1

假设您希望选择带有该 href 的锚链接的链接文本,那么这样的事情应该可以工作......

$input = '<a href="http://www.test.com" title="test">http://www.test.com</a>';
$pattern = '#<a href="http://www\.test\.com"[^>]*>(.*?)</a>#';

if (preg_match($pattern, $input, $out)) {
    echo $out[1];
}

这在技术上并不完美(理论上 > 可能会在其中一个标签中使用),但可以在 99% 的情况下使用。正如一些评论所提到的,您应该使用 DOM。

于 2010-07-29T10:09:14.440 回答
-1

如果您已经获得了锚标记,则可以通过正则表达式轻松提取 href 属性:

<a [^>]*href="([^"])"[^>]*>

如果您想提取标签的内容并且您知道自己在做什么,那么使用级联正则表达式编写一个简单的递归下降解析器并不难,它将解析除最病态之外的所有情况。不幸的是,PHP 不是学习如何做到这一点的好语言,所以我不建议使用这个项目来学习如何做。

因此,如果它是您所追求的内容,而不是属性,那么@katrielalex 是正确的:不要使用正则表达式解析 HTML。您将遇到嵌套格式标签和其他与正则表达式不兼容的合法 HTML 的伤害世界。

于 2010-07-29T10:09:41.810 回答