切换h6标记内两个链接的href

时间:2013-12-09 22:12:26

标签: php html regex domdocument

假设我有一串html。我们称之为$html只是为了原创,它看起来像这样:

<h6><a href="1a">ABC</a> | <a href="1b" target="_blank">XXX</a></h6>
<p>fffffff
<h6><a href="2a">DEF</a> | <a href="2b" target="_blank">XXX</a></h6>
<p>ddddddd
<h6><a href="3a">GHI</a> | <a href="3b" target="_blank">XXX</a></h6>
<p>bbbbbbb

我想从每个href标记的第二个链接中获取targetH6,并将其用于标记中的第一个链接,然后删除|完全是第二个链接所以它看起来像这样:

<h6><a href="1b" target="_blank">ABC</a></h6>
<p>fffffff
<h6><a href="2b" target="_blank">DEF</a></h6>
<p>ddddddd
<h6><a href="3b" target="_blank">GHI</a></h6>
<p>bbbbbbb

我知道我需要使用HTML解析器,但我不确定如何使用它。这样做最简单的方法是什么?我在PHP中这样做。

2 个答案:

答案 0 :(得分:1)

如您所知,HTML不是常规语言,因此无法通过正则表达式完全解析。但是,在这种情况下,您可以使用正则表达式完成所需的操作。替换:

<h6><a href=".*?">(.*?)</a> \| <a href="(.*?)" target="(.*?)">.*?</a></h6>

使用:

<h6><a href="$2" target="$3">$1</a></h6>

当然,这假设没有任何意外:也就是说,您的标签没有其他属性,如类或ID,并且一切都是一致的。如果他们这样做,你有一个稍微复杂的问题,需要一个完整的解析器,或多个正则表达式。

答案 1 :(得分:1)

您可以使用以下代码:

$input='<h6><a href="1a">ABC</a> | <a href="1b" target="_blank">XXX</a></h6>\n' .
       '<p>fffffff\n' .
       '<h6><a href="2a">DEF</a> | <a href="2b" target="_blank">XXX</a></h6>\n' .
       '<p>ddddddd\n' .
       '<h6><a href="3a">GHI</a> | <a href="3b" target="_blank">XXX</a></h6>\n' .
       '<p>bbbbbbb';

echo preg_replace(
     '#<h6><a href=".*?">(.*?)</a> \| <a href="(.*?)" target="(.*?)">.*?</a></h6>#',
     '<h6><a href="$2" target="$3">$1</a></h6>',
     $input
);

描述

Regular expression visualization

演示

http://codepad.org/QmhPqGlP