在php中替换自定义html标记

时间:2010-10-04 02:00:38

标签: php html regex tags

我的应用中有自定义HTML标记,它看起来像这样:<wiki href="articletitle">Text</wiki>并希望将其替换为:<a href="http://myapps/page/articletitle">Text</a>。我怎么能用PHP做到这一点?

5 个答案:

答案 0 :(得分:1)

不要尝试使用RegEx解析HTML。请改用DOM。这是一个很好的阅读:http://php.net/manual/en/book.dom.php

答案 1 :(得分:1)

Ruel是对的,DOM解析是接近它的正确方法。然而,作为正则表达式中的练习,这样的事情应该起作用:

<?php
$string = '<wiki href="articletitle">Text</wiki>';
$pattern = '/<wiki href="(.+?)">(.+?)<\/wiki>/i';
$replacement = '<a href="http://myapps/page/$1">$2</a>';
echo preg_replace($pattern, $replacement, $string);
?>

答案 2 :(得分:0)

trying to do something very similar。我建议像瘟疫一样避免regEx。它从来没有像看起来那么容易,那些角落的情况会引起噩梦。

现在我倾向于Custom Tags图书馆mentioned in this post。最好的功能之一是支持埋藏或嵌套标签,如下面的代码块:

<ct:upper type="all">
    This text is transformed by the custom tag.<br />
    Using the default example all the characters should be made into uppercase characters.<br />
    Try changing the type attribute to 'ucwords' or 'ucfirst'.<br />
    <br />
    <ct:lower>
        <strong>ct:lower</strong><br />
        THIS IS LOWERCASE TEXT TRANSFORMED BY THE ct:lower CUSTOM TAG even though it's inside the ct:upper tag.<br />
        <BR />
    </ct:lower>
</ct:upper>

我强烈建议您下载zip文件并查看其中包含的示例。

答案 3 :(得分:0)

我正在使用Query Path来执行此操作,这是一篇包含大量代码示例的博客文章。

http://www.wingtiplabs.com/blog/posts/2013/03/18/domain-specific-markup-language/

答案 4 :(得分:0)

当合法的解析器可以更可靠地完成工作时,请不要使用正则表达式。

由于您的文档包含无效的标记,因此您需要在加载html之前使解析器不满意。

我更喜欢使用DOMDocument及其声明式/不言自明的方法。

代码:(Demo

$html = <<<HTML
<div>
    <wiki href="articletitle">Text</wiki>
</div>
HTML;
$appPath = 'http://myapps/page/';

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
foreach ($dom->getElementsByTagName('wiki') as $wiki) {
    $a = $dom->createElement('a');
    $a->setAttribute('href', $appPath . $wiki->getAttribute('href'));
    $a->nodeValue = $wiki->nodeValue;
    $wiki->parentNode->replaceChild($a, $wiki);
}
echo $dom->saveHTML();

输出:

<div>
    <a href="http://myapps/page/articletitle">Text</a>
</div>