0

我在 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);

有没有人有任何想法?这 ?after (type=\"(.+?)\") 是使该块可选。似乎替换只是跳过它,因为它是可选的。我想我在某个地方有贪婪的问题,但我无法解决它。

如果您对我也可以这样做的另一种方式有任何想法,请回复。

4

1 回答 1

1

第一个段块没有右括号]。因为它没有找到与该结束块匹配的内容,所以.*?匹配到 的所有内容[/segment],忽略您放入其中的可选组。

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

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

您在问题中列出的输入以及您的特定匹配segment让我相信您的正则表达式也过于复杂,并且替换非常混乱。这个更新的正则表达式也不需要 DOTALL 标志。

$pattern = '/\[segment(?: type="([^"]+)")?\]/i';
$replacement = '[segmentclass=\'$1 segment\']';
于 2013-05-19T22:04:17.537 回答