Search code examples
phpstringcutsubstr

Operation on string in PHP. Remove part of string


How can i remove part of string from example:

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

I always want to pull middle of string: test, school, test33. from this string. I Read about ltrim, substr and other but I had no good ideas how to do this. Becouse each of strings can have other length for example :

'eng', 'fr'

I just want have string from middle between @@ and @@. to Maye someone can help me? I tried:

foreach ($article as $art) {

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

But there

@@lang_eng_end@@

can be changed to

@@lang_ger_end@@

in next row so i ahvent idea how to fix that


Solution

  • If your strings are always in this format, an explode way looks easy:

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

    You may use a regex and extract the value in between the non-starting @@ and next @@:

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

    See the PHP demo. Here, the regex matches a @@ that is not at the string start ((?!^)@@), then captures into Group 1 any 0+ chars other than newline as few as possible ((.*?)) up to the first @@ substring.

    Or, replace all @@...@@ substrings with `preg_replace:

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

    See another demo. Here, we just remove all non-overlapping substrings beginning with @@, then having any 0+ chars other than a newline up to the first @@.