我的应用程序中有一个自定义 html 标记,如下所示:
<wiki href="articletitle">Text</wiki>`
并想用这个替换它:
<a href="http://myapps/page/articletitle">Text</a>
我如何在 PHP 中做到这一点?
我的应用程序中有一个自定义 html 标记,如下所示:
<wiki href="articletitle">Text</wiki>`
并想用这个替换它:
<a href="http://myapps/page/articletitle">Text</a>
我如何在 PHP 中做到这一点?
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);
?>
我正在尝试做一些非常相似的事情。我建议像瘟疫一样避免使用正则表达式。它从来没有看起来那么容易,那些极端情况会导致噩梦。
现在我倾向于这篇文章中提到的自定义标签库。最好的功能之一是支持隐藏或嵌套标签,如下面的代码块:
<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 文件并查看其中包含的示例。
当合法的解析器可以更可靠地完成工作时,不要使用正则表达式。
由于您的文档包含无效标记,因此您需要在加载 html 之前消除解析器的不满。
我更喜欢使用 DOMDocument 及其声明性/不言自明的方法。
代码:(演示)
$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>