Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么正则表达式应该与preg_replace一起使用以替换相关文本?_Php_Regex_Preg Replace_Str Replace - Fatal编程技术网

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

Php 什么正则表达式应该与preg_replace一起使用以替换相关文本?,php,regex,preg-replace,str-replace,Php,Regex,Preg Replace,Str Replace,G'day 我正试图找出如何替换某些文本,使用以下示例: 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]. []中的

G'day

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

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属性(类、id等)

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


任何建议都将不胜感激。

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

但是,要快速解决您的问题,请尝试:

$text = 'Lorem ipsum .....';
$patterns = array('/\[annotate([^\]]*)\]/',
                  '/\[\/annotate\]/');
$replacements = array('<span blahablah \1>',
                      '</span>');
echo preg_replace($patterns, $replace, $text);
$text='Lorem ipsum….';
$patterns=array('/\[注释([^\]]*)\]/',
“/\[\/注释\]/”);
$replacements=数组(“”,
'');
echo preg_replace($patterns,$replace,$text);
$patterns
的第一个元素是开始标记,第二个元素是结束标记。 开始标记捕获
注释之后的所有内容,直到相应的结束
]
,并使用
\1
将其保存在
替换中

我说正则表达式不是标记解析的最佳方法的一个原因是,如果
注释
包含一个杂散的
]
,那么正则表达式就会出错


例如,
[annotate extraattribute=“alblasd]”]
将在第一个
]
而不是第二个位置被切断。

是否需要允许换行和回车?在[and]之间将不会有任何新行或回车。@Metalskin:如果您基于[and]构建自己的DOM,那么是的。但通常DOM解析器指的是HTML DOM文档,所以不是。我认为Mathematic coffee只是想指出,如果您的文本实际上是HTML,则正则表达式在处理它时会遇到问题。@mathematic.coffee。谢谢,伙计,这应该对我有用。我可以控制属性的任何值,因为它是系统生成的而不是用户输入的:编辑:我删除了我之前关于使用DOM进行[和]的评论,并认为我可以更好地重新发布,但hakre在我这样做时发布了一条回复,认为我应该解释一下。@hakre感谢您的澄清,如果可以的话,我宁愿使用DOM解析器,但我认为我无法使用[和]是的,我自己对DOM解析器作为正则表达式黑客和斜杠没有太多的经验(我只编写个人使用的代码,所以对尝试用正则表达式黑客解析类似HTML的东西和处理奇怪的错误解析没有任何顾虑),但我(错了?)假设DOM解析器允许您从
将分隔符设置为
[]
(似乎足够合理!)。只是“使用DOM而不是regex”是对所有regex/html类型问题的一般性陈述,所以我想保持StackOverflow的传统:)@mathematic.coffee我认为这取决于实现以及它是否允许任何选项设置[and]的使用或者如果它可以扩展和覆盖以允许自定义功能。我使用的语言是PHP,虽然我相信内置DOM解析器可以扩展,但由于时间限制,我不会这么做。如果我有时间重温这一点,我可能会深入研究它(我们都知道,人们以后从来没有时间重温代码):-)