【问题标题】:Using preg_replace_callback to identify and manipulate latex code使用 preg_replace_callback 识别和操作 Latex 代码
【发布时间】:2012-01-29 15:14:28
【问题描述】:

我有以下形式的latex + html代码:

...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc

首先我想获取数组code[]中的乳胶代码,以便能够将它们发送到服务器进行渲染,这样

code[0]=latex-code1, code[1]=latex-code2, etc

其次,我想修改此文本,使其看起来像:

...some text1.... <img src="root/1.png">....some text2....<img src="root/2.png">....etc

即,第 i 个乳胶代码片段被第 i 个渲染图像的链接替换。

我一直在尝试使用 preg_replace_callback 和 preg_match_all 来做到这一点,但是对于 PHP 来说是新手,无法让它发挥作用。请指教。

【问题讨论】:

  • 请显示您到目前为止尝试过的代码。迄今为止最成功的一点是什么?如果太复杂,先只从匹配开始。
  • 为了使用 preg_match_all 获取乳胶代码,我做了:$pattern='/([)(.*)(])/'; preg_match_all($pattern,$content,$latex_codes, PREG_PATTERN_ORDER);即使这也不起作用。我应该能够获得 $latex_codes[1] 中的所有乳胶代码

标签: php regex preg-match preg-replace-callback


【解决方案1】:

如果您正在寻找 codez:

$html = '...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc';

$codes = array();
$count = 0;
$replace = function($matches) use (&$codes, &$count) {
    list(, $codes[]) = $matches;
    return sprintf('<img src="root/%d.png">', ++$count);
};
$changed = preg_replace_callback('~\\\\\\[(.+?)\\\\\\]~', $replace, $html);

echo "Original: $html\n";
echo "Changed : $changed\n\nLatex Codes: ", print_r($codes, 1), "Count: ", $count;

我不知道你在哪个部分遇到了问题,如果是正则表达式模式,你在标记中使用需要大量转义的字符:对于 PHP 和 PCRE,这就是为什么有这么多斜杠。

另一个棘手的部分是回调函数,因为它需要收集代码以及有一个计数器。它在示例中使用匿名函数完成,该函数在其 use 子句中具有变量别名/引用。这使得变量$codes$count 在回调中可用。

【讨论】:

  • 我想我遇到了正则表达式模式的问题。这真的很有帮助。谢谢!
  • 嗨 hakre,您能否将上述代码的等效版本发送给我,以用于较低版本的 PHP。我认为您在 $replace 中使用了匿名函数,该函数不是由我的服务器(bravehost)上的 php 编译器编译的?
  • 它需要 PHP 5.3,对。要在 PHP 5.2 中做到这一点,您需要将回调封装到一个类函数中,以便能够使用 $codes$count 变量。
猜你喜欢
  • 2012-10-30
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2019-12-10
  • 2011-06-17
相关资源
最近更新 更多