什么正则表达式应该与preg_replace一起使用来替换相关的文本?

时间:2012-01-02 08:10:26

标签: php regex preg-replace str-replace

天儿真好,

我正在尝试找出如何替换一些文本,使用以下示例:

Lorem ipsum dolor sit amet, [annotate ref="C1849"]consectetur 
adipisicing elit[/annotate], sed do eiusmod tempor incididunt 
ut labore et [annotate ref="C9437"]dolore[/annotate] magna 
[fred ref="38"]aliqua[/fred].

[]中的文字将被替换,具体取决于开幕后的值[。在这种情况下,目标是替换注释'标签'。新文本将是html标签,可能是span或类似的,以及插入一些html属性(class,id等)。

我可以通过str_replace()替换[annotate和[/ annotate]。我也可以通过str_replace()替换所有“]。但是我不希望仅当”]与[annotate]相关时才替换所有出现的“],所以我认为正则表达式与preg_replace()会更合适替换“]。我一直在玩lookbehind,直到我意识到lookbehind只处理固定长度的字符串。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

一般来说,使用正则表达式来解析类似xml的数据(标签/结束标签/属性)是个坏主意:某种类型的DOM解析器要好得多。

但是,要快速修复问题,请尝试:

$text = 'Lorem ipsum .....';
$patterns = array('/\[annotate([^\]]*)\]/',
                  '/\[\/annotate\]/');
$replacements = array('<span blahablah \1>',
                      '</span>');
echo preg_replace($patterns, $replace, $text);

$patterns的第一个元素是开始标记,后者是结束标记。 开始标记会在annotate之后捕获所有内容,直到相应的结束],然后使用replacements将其保留在\1中。

我说正则表达式不是标记解析的最佳选择的一个原因是,如果annotate包含一个迷失正则表达式的迷路]

E.g。 [annotate extraattribute="alblasd]"]将在第一个]而不是第二个{{1}}被切断。