我目前正在开发一个网站项目,我正在从头到尾开发一个自制的内容管理系统。以前的网站是在SPIP(法语CMS)下运行的,我正在努力从新平台上的SPIP数据库中导入旧内容。
事情进展顺利,我收到了所有的文章,设法编写了一个新的URL重写引擎,保留旧的重写链接,原样,...
我遇到的麻烦是包含特殊标签的文章的TEXT字段。我确实使用str_replace将类似bbcode的基本标签转换为html,但是在尝试在更高级的标签上使用preg_replace时遇到了一些麻烦。
以下是标签的外观。它包含在$ texte var:
中的纯文本之间<doc30292|right>
如您所见,语法如<docID|alignment>
我需要替换所有看起来像这样的标签
display_doc($id,$alignment)
我确实设法使用preg_match获取ID或对齐,但我确实想使用preg_replace,我不知道如何做到这一点。 PCRE不属于我的实力......
有任何帮助吗?
$texte=nl2br($texte);
$texte=preg_replace('#(<br */?>\s*)+#i', '<br /><br/>', $texte);
// SPIP Intertitre
$texte=str_replace("{{{","<h2>",$texte);
$texte=str_replace("}}}","</h2>",$texte);
// SPIP Gras
$texte=str_replace("{{","<b>",$texte);
$texte=str_replace("}}","</b>",$texte);
// SPIP Italic
$texte=str_replace("{","<i>",$texte);
$texte=str_replace("}","</i>",$texte);
preg_match('/<doc(.*?)\|/', $texte, $match);
var_dump($match);
echo $match[1];
答案 0 :(得分:0)
<?php
$subject = '<doc30292|right>';
$pattern = '/<([^|]+)\|([^>]+)>/';
if (preg_match($pattern, $subject, $tokens)) {
list($_, $id, $alignment) = $tokens;
echo sprintf('display_doc(%s, %s)', $id, $alignment);
}
为此,我得到输出display_doc(doc30292, right)
。
至于替换多次出现,如下面的评论所述,我会使用更方便的preg_replace_callback()
函数:
<?php
$subject = 'dumbo<doc4711|left>bla<doc30292|right>blub<doc666|center>lamda';
$pattern = '/<([^|]+)\|([^>]+)>/';
echo preg_replace_callback(
$pattern,
function ($_) { return sprintf('display_doc(%s,%s)',$_[1],$_[2]); },
$subject);
这显然会返回:dumbodisplay_doc(doc4711,left)bladisplay_doc(doc30292,right)blubdisplay_doc(doc666,center)lamda