php正则表达式问题 - 无法删除/删除和替换字符串中的字符串

时间:2014-02-23 02:37:53

标签: php

我之前从未使用过正则表达式,现在我需要它们,而且我遇到了一些问题,并且达到了预期的效果。

以此为例:

[x:3xerpz1z]Some Text[/x:3xerpz1z] Some More Text

使用php preg_replace()功能,我想用< start>替换 [x:3xerpz1z] [/ x:3xerpz1z] 与< / end>但我无法弄清楚这一点。我已经阅读了一些正则表达式教程,但我仍然感到困惑。

我已尝试过这个作为起始标记:

preg_replace('/(.*)\[x:/','<start>', $source_string);

以上将返回:&lt; start&gt; 3xerpz1z

正如您所看到的,“3xerpz1z”未被删除,需要将其删除。我不能硬编码和搜索并替换“3xerpz1z”,因为“3xerpz1z”字符是随机生成的,字符总是不同但标签的长度是相同的。

这是我想要的输出:

<start>Some Text</end> Some More Text

我没有尝试过处理 [/ x:3xerpz1z] 的事件,因为我甚至无法获得第一个标记。

1 个答案:

答案 0 :(得分:1)

您必须使用捕获组(....)

$data = '[x:3xerpz1z]Some Text[/x:3xerpz1z] Some More Text';

$result = preg_replace('~\[x:([^]]+)](.*?)\[/x:\1]~s', '<start>$2</end>', $data);

模式细节:

~         # pattern delimiter: better than / here (no need to escape slashes)
\[x:
([^]]+)   # capture group 1: all that is not a ]
]         
(.*?)     # capture group 2: content
\[/x:\1]  # \1 is a backreference to the first capturing group
~s        # s allows the dot to match newlines