如何使preg_replace不饿?

时间:2018-10-28 10:42:02

标签: php regex preg-replace

我有一个字符串:

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

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

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

如果占位符{:en}的值是Helo world作为$lang_content的值,它可以正常工作,但是如果{:de}我是Hallo Welt{:}{:en}Helo world。 如何解决?谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

$placeholder = '{:de}';
$lang_content =  preg_replace('/(.*)'.preg_quote($placeholder).'(.*?)'.preg_quote('{:}').'(.*)/sm', '\2', $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

答案 1 :(得分:0)

带有[Ungreedy]标志(U)。

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

如果该字符串包含多个匹配项,也许您还可以添加全局(g)标志,以使正则表达式在第一个之后不会停止。

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

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