对 PHP 中的字符串进行操作。删除部分字符串

Operation on string in PHP. Remove part of string

如何从示例中删除部分字符串:

@@lang_eng_begin@@test@@lang_eng_end@@ @@lang_fr_begin@@school@@lang_fr_end@@ @@lang_esp_begin@@test33@@lang_esp_end@@

我一直想拉弦的中间:test, school, test33。从这个字符串。 我阅读了有关 ltrim、substr 和其他内容的信息,但我不知道如何执行此操作。因为每个字符串都可以有其他长度,例如:

'eng', 'fr'

我只想要@@ 和@@ 中间的字符串。到梅耶有人可以帮助我吗?我试过了:

foreach ($article as $art) {

                $title = $art->titl = str_replace("@@lang_eng_begin@@", "", $art->title);
                $art->cleanTitle = str_replace("@@lang_eng_end@@", "", $title);
            }

但是

@@lang_eng_end@@

可以改成

@@lang_ger_end@@

在下一行,所以我不知道如何解决这个问题

如果您的字符串总是这种格式,explode方式看起来很简单:

$str = "@@lang_eng_begin@@test@@lang_eng_end@@ "; 
$res = explode("@@", $str)[2];
echo $res;

您可以使用正则表达式并提取非起始 @@ 和下一个 @@:

之间的值
$re = "/(?!^)@@(.*?)@@/"; 
$str = "@@lang_eng_begin@@test@@lang_eng_end@@ "; 
preg_match($re, $str, $match);
print_r($match[1]);

参见PHP demo。在这里,正则表达式匹配一个不在字符串开头的 @@ ((?!^)@@),然后将除换行符之外的任何 0+ 个字符尽可能少地捕获到第 1 组 ((.*?))到第一个 @@ 子串。

或者,将所有 @@...@@ 子字符串替换为 `preg_replace:

$re = "/@@.*?@@/"; 
$str = "@@lang_eng_begin@@test@@lang_eng_end@@ "; 
echo preg_replace($re, "", $str);

参见 another demo。在这里,我们只删除所有以 @@ 开头的非重叠子字符串,然后在第一个 @@.

之前有除换行符以外的任何 0+ 个字符