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
<代码>?太多了!它很好用。