正则表达式在锚标记的开头插入字符串?

时间:2010-09-27 13:28:14

标签: php html regex

我需要在打开的锚点结束后(锚点内容开始的地方)直接插入一个字符串。

这是我的代码:

<ul id="menu-topmenu2" class="menu">
    <li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5">
        <a href="http://localhost/domain/barnlager.se/?page_id=2">
            About
        </a>
    </li>
    <li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5">
        <a href="http://localhost/domain/barnlager.se/?page_id=2">
            Services
        </a>
    </li>
</ul>

在这个例子中,我需要在“关于”和“服务”之前的内容。一个简短的正则表达式应该做到吗?上面的HTML代码可以是名为$ content的字符串。

我使用PHP。谢谢!

2 个答案:

答案 0 :(得分:3)

我使用解析器,例如DOM:

$content = '...your html string...';
$doc = new DOMDocument();
$doc->loadHTML('<html><body>'.$content.'</body></html>');
$x = new DOMXPath($doc);
foreach($x->query('//a') as $anchor){
    // strrev(trim($anchor->nodeValue))) is just an example. put anything you like.
    $anchor->insertBefore(new DOMText(strrev(trim($anchor->nodeValue))),$anchor->firstChild);
}
echo $doc->saveXML($doc->getElementsByTagName('ul')->item(0));

作为一个额外的奖励,它会抛出一个警告,你已经在HTML中定义了id="menu-item-5"两次,这是无效的。

答案 1 :(得分:1)

您可以找到/<a.*?>/i的每个锚标记。如果您想在此之后替换某些内容,则该调用将显示为preg_replace("/(<a.*?>)/", '$1YOUR ADDITIONAL TEXT', $content)

如果出于某种原因需要双引号字符串作为替换参数,请确保反斜杠 - 转义$1