天儿真好,
我正在尝试找出如何替换一些文本,使用以下示例:
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只处理固定长度的字符串。
任何建议都将受到赞赏。
答案 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}}被切断。