这就是问题所在:我有一个数据库,里面满是用 XHTML 标记的文章。我们的应用程序使用Prince XML生成 PDF。其中一个原因是脚注是内联标记的,使用以下模式:
<p>Some paragraph text<span class="fnt">This is the text of a footnote</span>.</p>
Prince 用span.fnt
数字脚注标记替换 every,并将随附的文本呈现为页面底部的脚注。
我们希望以电子书格式呈现相同的内容,XHTML 是一个很好的起点,但内联脚注很糟糕。我想要做的是在我的电子书构建脚本中将脚注转换为尾注。
这就是我的想法:
$endnotes
创建一个名为存储尾注文本的空数组。- 将变量
$endnote_no
设置为零。此变量将保存当前尾注编号,以内联方式显示为尾注标记,并用于将尾注标记链接到特定尾注。 - 使用
preg_replace
或preg_replace_callback
查找 的每个实例<span class="fnt">(.*?)</span>
。 $endnote_no
每个实例的增量,并将内联span
替换为'<sup><a href="#endnote_
' 。$尾注_没有。'">' .$endnote_no . ''`- 将脚注文本推送到
$endnotes
数组中,以便我可以在文档末尾使用它。 - 在用数字尾注引用替换所有脚注后,遍历
$endnotes
数组以将尾注作为 XHTML 中的有序列表输出。
这个过程有点超出我的 PHP 理解范围,当我尝试将其转换为代码时,我迷失了方向。这是我到目前为止所拥有的,我主要根据我在 PHP 文档中找到的代码示例拼凑而成:
$endnotes = array();
$endnote_no = 0;
class Endnoter {
public function replace($subject) {
$this->endnote_no = 0;
return preg_replace_callback('`<span class="fnt">(.*?)</span>`', array($this, '_callback'), $subject);
}
public function _callback($matches) {
array_push($endnotes, $1);
return '<sup><a href="#endnote_' . $this->endnote_no++ . '">' . $this->endnote_no . '</a></sup>';
}
}
...
$replacer = new Endnoter();
$replacer->replace($body);
echo '<pre>';
print_r($endnotes); // Just checking to see if the $endnotes are there.
echo '</pre>';
任何指导都会有所帮助,尤其是如果有更简单的方法可以到达那里。