如何让preg_replace不饿?

How to make preg_replace not hungry?

我有一个字符串:

$str = '{:de}Hallo Welt{:}{:en}Helo world{:}';

现在我需要获取设置语言的子字符串。

$placeholder = '{:en}';
$lang_content =  preg_replace('/(.*)'.preg_quote($placeholder).'(.*)'.preg_quote('{:}').'(.*)/sm', '', $str);

如果占位符的值 {:en} 我得到 Helo world 作为 $lang_content 的值,它工作正常,但如果 {:de} 我得到 Hallo Welt{:}{:en}Helo world. 如何修复?谢谢!

您需要通过在第二次捕获中添加 ? 来使正则表达式变得惰性。

$str = '{:de}Hallo Welt{:}{:en}Helo world{:}';

$placeholder = '{:de}';
$lang_content =  preg_replace('/(.*)'.preg_quote($placeholder).'(.*?)'.preg_quote('{:}').'(.*)/sm', '', $str);

echo $lang_content; // Hallo Welt

https://3v4l.org/m6AGF


一种可选的方法是使用 preg_match 来获取关联数组。

$str = '{:de}Hallo Welt{:}{:en}Helo world{:}';

preg_match_all("/\{:(.*?)}(.*?)\{/", $str, $matches);
$matches = array_combine($matches[1], $matches[2]);

var_dump($matches);
echo $matches["de"]; // Hallo Welt

https://3v4l.org/ELB2B

带有 Ungreedy 标志 (U)。

您可以将正则表达式末尾的标志从 /sm 更新为 /smU,以便结果在字符串中下一次出现 {:} 时停止,而不是在最后一个。

如果字符串要包含多次出现,也许您还可以添加全局 (g) 标志,这样正则表达式不会在第一次出现后停止。

你可以在这里测试:https://regex101.com/r/4XSPoz/3

顺便说一下,您似乎正在使用 preg_replace 作为查找子字符串的方法,实际上不需要在结果中替换它,也许您应该使用 preg_match .