来自使用特定<tags> </tags>的CMS数据库导入的Preg_replace

时间:2015-04-07 20:23:47

标签: php regex tags pcre

我目前正在开发一个网站项目,我正在从头到尾开发一个自制的内容管理系统。以前的网站是在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];

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