我之前从未使用过正则表达式,现在我需要它们,而且我遇到了一些问题,并且达到了预期的效果。
以此为例:
[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] 的事件,因为我甚至无法获得第一个标记。
答案 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