0

我有以下文字...

Lorem ipsum dolor sit amet, consectetur adipiscing elit。Cras lorem lacus,euismod ac convallis quis,adipiscing ut dui。[preformatted #1]This is preformatted text I do not want to alter[/preformatted]Ut porttitor Nunc urna dolor,porttitor vitae placerat sed,iaculis ut nibh。Etiam dignissim,nisl [preformatted #2]This is preformatted text I do not want to alter[/preformatted]commodo pulvinar facilisis,eros enim volutpat ante,sed feugiat risus justo vitae ipsum。Duis lobortis hendrerit orci,non semper dolor porta sed。

我想要实现的是将所有这些预先格式化的块替换为临时占位符文本,例如[placeholder1][placeholder2]并将原始块存储在某种索引数组中,以便在我执行一些块上的外部处理。

如果有人能指出我正确的方向,我将不胜感激。提前致谢。

4

2 回答 2

0

注意:我这里没有 PHP,所以实际上无法尝试。语法可能并不完美。

更清晰的答案,因为我现在更全面地了解您的用例。首先,我们接受来自用户的输入字符串,这将是一个字符串,但它的一部分将采用这种形式[preformatted]some text[/preformatted]我们想要获取该文本并使用preg_match_all将其放入数组中:

$input = $_POST['main_text'];
$preformatted = preg_match_all('/\[preformatted\](.*?)\[\/preformatted\]/is', $input);

现在我们以正确的顺序将预格式化的文本字符串放入数组中,我们将它们替换为这样的占位符(注意 - 占位符将被编号,因为我假设您对此文本所做的任何事情都可能重新排序占位符和我们想以正确的顺序替换)使用preg_replace

$placeholders = array();
for ($i = 1; $i <= sizeof($preformatted); $i++) {
    $placeholders[$i] = '{PREFORMATTED'.$i.'}';
    preg_replace('/\[preformatted\](.*?)\[\/preformatted\]/', $placeholders[$i], $input, 1);
}

(我们在for循环中执行此操作,将每次迭代限制为一个替换,以增加占位符值。因为我们知道替换的数量(sizeof($preformatted)),这是一个很好的工作解决方案。

现在我们有一个预先格式化的文本字符串数组 ( $preformatted)、一个占位符数组 ( $placeholders) 和一个准备对其执行操作的文本字符串 ( $input)。

对文本做任何你想做的事情,然后最后用str_replace切换回预格式化的字符串:

str_replace($placeholders,$preformatted,$input);
于 2013-05-03T11:26:11.723 回答
0
$blocks = array();

// gather preformatted blocks, and at the same time replace them in the
// original text with a hash
$str = preg_replace_callback('/\[preformatted #(\d+)\](.+?)\[\/preformatted\]/is',
   function($match) use(&$blocks){
     $hash = '<!-- ' . md5($match[2]) .' -->';
     $blocks[$hash] = $match[2];
     return $hash;
}, $str);

// here you do your processing on the $blocks array

// when done, put the blocks back in the text    
$str = strtr($str, $blocks);

对于一个适当和轻量级的 BBcode 解析器,请尝试JBBCode

于 2013-05-03T11:34:47.677 回答