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