1

我不擅长编写正则表达式,所以正在寻求帮助。

我有以下字符串:

<li class="current-menu-item"><a title="Site Name" href="http://www.example.com/">Home</a></li>

想要用 H1 替换超链接。

有没有一种使用正则表达式的简单方法来做到这一点,记住标题、超链接和锚文本的变化?

4

2 回答 2

1
preg_replace('/<a[^>]*>(\w+)<\/a>/', '<h1>$1</h1>', $subject);

']' 将匹配除 '>' 以外的所有字符,'*' 表示它将匹配其前面出现的零个或多个字符,然后 '>' 将在其后,然后它将捕获 () 中的所有字符, '\w' 将匹配任何单词字符,+ 将匹配至少一个出现在它前面的字符,然后 '' 将出现(正斜杠需要转义)。

$subject 可以是整个 HTML 文档或只是您的字符串。

于 2012-10-27T16:06:51.790 回答
1

如果您的输入不重要,我不鼓励为此使用正则表达式。多行 html 标签、非格式良好的输入、嵌入标签很容易将活动扳手扔到您的解决方案中。尝试改用 DOM 类:

$in = '<li class="current-menu-item"><a title="Site Name" href="http://www.example.com/">Home</a></li>';
$dom = new DOMDocument;
$dom->loadHTML($in);

// you can use any method to select the nodes in interest, if you need more power use xpath.
foreach ($dom->getElementsByTagName('a') as $a) {
    $replacement = $dom->createElement('h1');
    // poor man's innerHTML
    foreach ($a->childNodes as $cn) {
        $replacement->appendChild($cn);
    }   
    $a->parentNode->replaceChild($replacement, $a);
}

print $dom->saveHTML();
于 2012-10-27T16:18:47.173 回答