正则表达式锚标记

时间:2010-07-29 09:48:43

标签: php regex preg-match-all

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

示例:具有测试http://www.test.com

的锚标记

喜欢这个<a href="http://www.test.com" title="test">http://www.test.com</a>

我希望匹配锚标记中的所有文字

提前感谢。

3 个答案:

答案 0 :(得分: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。它会比您提出的任何正则表达式解决方案更强大。

答案 1 :(得分:-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];
}

这在技术上并不完美(理论上&gt;可以在其中一个标签中使用),但在99%的情况下都可以使用。正如一些评论所提到的那样,你应该使用DOM。

答案 2 :(得分:-1)

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

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

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

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