Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何让孕妇不饿?_Php_Regex_Preg Replace - Fatal编程技术网

Php 如何让孕妇不饿?

Php 如何让孕妇不饿?,php,regex,preg-replace,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作为$langu-cont

我有一个字符串:

$str = '{:de}Hallo Welt{:}{:en}Helo world{:}';
现在我需要得到设置语言的子字符串

$placeholder = '{:en}';
$lang_content =  preg_replace('/(.*)'.preg_quote($placeholder).'(.*)'.preg_quote('{:}').'(.*)/sm', '\2', $str);
对于占位符
{:en}
的值,我得到
Helo-world
作为
$langu-content
的值,它可以正常工作,但对于
{:de}
的情况,我得到
hello-Welt{:en}Helo-world

怎么能修好呢?塔克斯

您需要通过在第二个捕获中添加一个
使正则表达式变为惰性

$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
带有取消冻结标志(
U

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

如果字符串要包含多个实例,也许还可以添加global(
g
)标志,以便正则表达式不会在第一个实例之后停止

您可以在此处进行测试:


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

在正则表达式语言中,它被称为
lazy
<代码>?太多了!它很好用。