可选的正则表达式匹配被忽略


Optional regex match is being ignored

我在PHP中有一些正则表达式没有按照我想要的去做。

我想要的:

[segment type="segment_name"]more text here[/segment]

修改为:

[segmentclass='segment_name segment']more text here[/segment]

:

[segment]more text here[/segment]

修改为:

[segmentclass=' segment']more text here[/segment]

我有:

$pattern = '/('[segment.*?)(type='"(.+?)'")?(.*?'['/segment'])/is';
$replacement = '$1class=''$3 segment''$4';
$content = preg_replace($pattern, $replacement, $content);

有人有什么想法吗?的吗?在(type='"(.+?)'")之后是使该块可选。看起来替换只是跳过它,因为它是可选的。我想我有贪心的问题,但我一直没能解决。

如果你有任何其他的想法,请回复我,我也可以这样做。

第一个段块没有右括号]。因为它找不到关闭块的匹配项,所以.*?匹配直到[/segment]的所有内容,忽略您放在那里的可选组。

如果可以的话,您应该避免以任何形式使用.*,这是一个典型的情况,否定字符类将是合适的。[^']]*是更好的选择。

这个字符类在这里是一个更好的选择的原因是它会使正则表达式失败,而不是给你一个假阳性。

您在问题中列出的输入,以及您对segment的具体匹配,使我认为您的regex也过于复杂,替换非常混乱。这个更新后的正则表达式也不需要DOTALL标志。

$pattern = '/'[segment(?: type="([^"]+)")?']/i';
$replacement = '[segmentclass=''$1 segment'']';