アプリに次のようなカスタム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でそれを行うにはどうすればよいですか?
私は非常に似たようなことをしようとしています。ペストのように正規表現を避けることをお勧めします。それは思ったほど簡単ではなく、これらの特殊なケースは悪夢を引き起こします。
現在、この投稿で言及されているカスタム タグライブラリに傾倒しています。最高の機能の 1 つは、以下のコード ブロックのような埋め込みまたはネストされたタグのサポートです。
<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 ファイルをダウンロードして、そこに含まれるサンプルを確認することを強くお勧めします。
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);
?>
正当なパーサーがより確実にジョブを実行できる場合は、正規表現を使用しないでください。
ドキュメントに無効なマークアップが含まれているため、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>