使用preg_match从div中获取标签元素的列表

时间:2012-03-13 15:46:40

标签: php regex preg-replace preg-match

我有以下div:

<div class="divClass">Language:
    <a href="http://www.some-site.com/something/something2/">EN</a>
    <a href="http://de.some-site.com/something/something2/">DE</a>
    <a href="http://es.some-site.com/something/something2/">ES</a>
    <a href="http://fr.some-site.com/something/something2/">FR</a>
    <a href="http://it.some-site.com/something/something2/">IT</a>
    <a href="http://nl.some-site.com/something/something2/">NL</a>
    <a href="http://pt.some-site.com/something/something2/">PT</a>
    <a href="http://ru.some-site.com/something/something2/">RU</a>
    <a href="http://gr.some-site.com/something/something2/">GR</a>
    <a href="http://cn.some-site.com/something/something2/">CN</a>
    <a href="http://pl.some-site.com/something/something2/">PL</a>
    <a href="http://se.some-site.com/something/something2/">SE</a>
</div>

并使用此正则表达式模式:

/<div class="divClass"><a href="(.*)">(.*)<\/a><\/div>/i

要在以下表达式中使用:

$out=preg_replace('/<div class="divClass"><a href="(.*)">(.*)<\/a><\/div>/i',replace_link(substr('$1', strpos('$1','com/')+1),'$2'),$out);

我的preg_replace返回NULL。基本上我想从A标签中获取链接及其值,并将链接和值替换为我从replace_link函数获取的内容。

任何想法如何做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

你的正则表达式不好:它只匹配一个<a href=...> </a>,你提供了很多。

你必须使用类似的东西:

/<div class="divClass">\(<a href="(.*)">(.*)<\/a>\)+<\/div>/i

(不确定php中的非捕获语法)

您还必须在输入中处理空格(空格字符,制表符,行尾)。 如果您确定输入,可以使用以下内容:

/<div class="divClass">[^<]*(<a href="(.*)">(.*)<\/a>[^<]*)+[^<]*<\/div>/i

答案 1 :(得分:1)

这是您使用DomDocument的方式:http://codepad.org/RxZ7URMB

// Create new DomDocument
$doc = new DomDocument();
$doc->loadHTML($html);

// Get all <a>
$anchors = $doc->getElementsByTagName('a');

foreach ($anchors as $a) {
    echo $a->getAttribute('href') . PHP_EOL;
}

如果您想更进一步,请更换:http://codepad.org/diqRQhiZ

foreach ($anchors as $a) {
    $a->setAttribute('href', replace_link($a->getAttribute('href')));
}

echo $doc->saveHTML();