我有一个字符串:
$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
。
如何解决?谢谢!
答案 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
一种可选方法是使用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
答案 1 :(得分:0)
带有[Ungreedy]标志(U
)。
您可以将正则表达式末尾的标志从/sm
更新为/smU
,以使结果在字符串中下一次出现{:}
时停止,而不是最后一个
如果该字符串包含多个匹配项,也许您还可以添加全局(g
)标志,以使正则表达式在第一个之后不会停止。
您可以在这里进行测试:https://regex101.com/r/4XSPoz/3
顺便说一句,看来您正在使用preg_replace作为查找子字符串的方法,实际上并不需要在结果中替换它,也许您应该使用preg_match。