【问题标题】:regular expression anchor tag正则表达式锚标记
【发布时间】:2010-07-29 18:20:55
【问题描述】:

我正在使用 php,但在使用文本解析来自锚标记的 href 时遇到问题。

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

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

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

提前致谢。

【问题讨论】:

  • 你能展示你尝试了什么吗?
  • stackoverflow.com/questions/1732348/…: 不要用正则表达式解析 HTML。
  • 两个问题,第一个:你要匹配test还是h ttp://www.test.com?第二:你想匹配它<a href=" here? "> or here? </a>吗?

标签: php regex preg-match-all


【解决方案1】:

使用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。它比您想出的任何正则表达式解决方案都更强大。

【讨论】:

  • 并不是说你的做法有什么“错误”,你为什么不直接使用DomElement::getElementsByTagName() 而不是XPath 查询呢?对于那个简单的路径,它应该更有效......
【解决方案2】:

假设您希望选择带有该 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% 的情况下使用。不过,正如一些 cmets 所提到的,您应该使用 DOM。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多