Php 研究并替换wordrtf

Php 研究并替换wordrtf,php,regex,word,rtf,Php,Regex,Word,Rtf,我正在开发一个应用程序,它有一个邮政邮件的工作流程。这些邮件是根据我的应用程序业务规则生成的 模型是html或Rtf格式的,只要用户不使用word创建Rtf,它就可以完美地工作。这不在规范范围内,但如果不涉及太多工作,我的层次结构将欢迎一个单词兼容性,这将使我们的客户感到满意和轻松 Rtf模型具有由应用程序值替换的标记。在大多数RTF中,标记不会被拆分,因此搜索和替换工作非常完美。我希望在处理这个词时稍加修改 示例数据:[[FooBuzz]]在大多数rtf中,它没有被拆分 在word 2003中

我正在开发一个应用程序,它有一个邮政邮件的工作流程。这些邮件是根据我的应用程序业务规则生成的

模型是html或Rtf格式的,只要用户不使用word创建Rtf,它就可以完美地工作。这不在规范范围内,但如果不涉及太多工作,我的层次结构将欢迎一个单词兼容性,这将使我们的客户感到满意和轻松

Rtf模型具有由应用程序值替换的标记。在大多数RTF中,标记不会被拆分,因此搜索和替换工作非常完美。我希望在处理这个词时稍加修改

示例数据:[[FooBuzz]]在大多数rtf中,它没有被拆分

在word 2003中:

{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 [[}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2708730 FooBuzz}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 ]]}
他们的单词(word 2007)也被拆分为Foo{garbage inside}Buzz

因此,我希望能够完美地处理常见的RTF,并检测标记,即使它们被拆分

我有两个限制。首先,没有回归,其次,它必须保持简单。性能在这里不是问题

我用的是symfony1.4。实际相关研究代码部分:

$regExpression = '/\[\[([^\[\]]*)\]\]/';  

preg_match_all($regExpression, $sTemplate, $outKeys); 
更新:

我想我主要需要完善这个正则表达式。我正在开发一些正则表达式,但它们仍然需要一些改进:

/([\a-zA-Z0-9]+)/  
制作:

[0] => Array
    (
        [0] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 [[
        [1] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2708730 FooBuzz
        [2] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 ]]
    )
更新2:

我对正则表达式还有一些问题。它实际上找到了第一个标签值和纯文本。 我不确定我想要什么在合理的时间内是可能的

我需要修改正则表达式,以便她捕获相同的结果,但在[[]内,它实际上也可以在纯文本上工作

更困难的是,我必须能够通过任何我必须的方式捕获所有样本数据(但不是纯文本)

对于我的replace regex,它将替换我的标记和所有垃圾。我几乎成功了:

/{.*?\[\[.*(?<!\\)\w+\b.*\]\].*?}/

编辑后,查找FooBuzz或您可以搜索的任何其他标记

(?<=\[\[).+?\b(?<!\\)(\w+)\b(?=.+?\]\])
Preg\u match\u all
将返回2个选项卡。1包含与正则表达式匹配的数据,第二个是标记


然后由于strtr功能,只有与翻译匹配的标签才会被替换。(工作流程中3轮)。

以防一些人遇到同样的问题。更好的全球解决方案。单词的RTF表示取决于。。。警方。因此,在《泰晤士报新罗马作品》中对[[foobzz]]进行简单的文本搜索。但是在Arial中,这个词被分解了,你需要一个聪明的正则表达式

示例:

Police                Text                                RTF
 Times new roman        [[FooBuzz]]                       {\someRtfTags [[FooBuzz]]}
  Arial                 [[FooBuzz]]                         {\hich\af1\dbch\af12\loch\f1 [[Signature}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15225063 \hich\af1\dbch\af12\loch\f1 President}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1974114\charrsid1974114 \hich\af1\dbch\af12\loch\f1 ]]}

因此,请使用Times new Roman作为标记。

谢谢,您的负面查找非常有趣。编辑:您的链接很有趣。但在我的情况下,这是正则表达式或什么都没有。我可以主动稍加修改以处理单词。但不是完全重写它。所以我必须使用正则表达式。m问题的视觉线索:理想情况下,我只需要匹配3。但是只要他们一直在这里,我就可以应付他们。明白了!您提供的链接中的结果有什么问题?在页面的右侧,所有内容都正确分组(或者我错过了什么吗?)您是否尝试过此
(?{
使用此
{[^{]*?\[\[.*)(?(我还添加了分组以捕获foobar)没有必要这样做,如果你更新我的答案或发布你自己的答案,可能会更有用。人们来到这里,希望在上半部分找到问题,在下半部分找到答案,不要混淆:)你的上一个正则表达式是错误的,因为它希望在最后一个方括号后面有一个
\w+
,它只会匹配类似
[[wordWithoutSpaces]]
(?<=\[\[).+?\b(?<!\\)(\w+)\b(?=.+?\]\])
{[^{]?[[.(?<=[[).+?\b(?]].?}
Police                Text                                RTF
 Times new roman        [[FooBuzz]]                       {\someRtfTags [[FooBuzz]]}
  Arial                 [[FooBuzz]]                         {\hich\af1\dbch\af12\loch\f1 [[Signature}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15225063 \hich\af1\dbch\af12\loch\f1 President}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1974114\charrsid1974114 \hich\af1\dbch\af12\loch\f1 ]]}