【问题标题】:Preg_replace from a CMS db import that uses specific <tags>Preg_replace 来自使用特定 <tags> 的 CMS 数据库导入
【发布时间】:2015-04-07 20:23:46
【问题描述】:

我目前正在使用自制的内容管理系统从头开始开发一个网站项目。以前的网站在 SPIP(法国 CMS)下运行,我正在努力从新平台上的 SPIP 数据库中导入旧内容。

一切进展顺利,我收到了所有文章,设法编写了一个新的 URL 重写引擎,使旧的重写链接保持原样,..

我遇到的问题是文章的 TEXT 字段包含特殊标签。我确实使用 str_replace 将基本的类似 bbcode 的标签转换为 html,但是在尝试在更高级的标签上使用 preg_replace 时遇到了一些麻烦。

这是标签的外观。它包含在 $texte var 中的纯文本之间:

<doc30292|right>

如您所见,语法类似于&lt;docID|alignment&gt; 我需要将所有看起来像这样的标签替换为 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];

【问题讨论】:

  • 好吧,发布你的代码,我们当然可以帮助......
  • 完成 :) 感谢您的帮助

标签: php regex tags pcre


【解决方案1】:
<?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

【讨论】:

  • 感谢您的帮助,先生!它运作良好,除非它只对第一次出现有效。有没有办法用 preg_replace 做到这一点?
  • 再次感谢!但遗憾的是,我仍然面临问题:(首先,只有两个 标签被正确替换,但不是在它们属于字符串的位置:它们被移动到字符串的顶部。我不不明白为什么。(这是一个从包含 1000 字以上文章的数据库中提取的巨大字符串)
  • 抱歉,对此我无话可说。您必须发布您的字符串和您当前的脚本。我建议您针对该特定问题提出一个新问题...
  • 我修好了这个!!谢谢 ! :) 我以错误的方式使用代码 ;)
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多