1
votes

I want to replace any word which contains two capital letters .

here is my string

jennie-garth-jennie-garth-inner-city-arts-gala-october-17-2012-If9aSpTW
jennie-garth-jennie-garth3892-H9rDcbY 

i want to replace -If9aSpTW with -

These -If9aSpTW varies so I can't use str_replace. I can identify with only two capital letter in one word. These words are at the end, but these types of words are appearing for 20% of total database values so I can't replace all last words.

1
i am not getting how to do.Steeve
Have you considered explode("-", $val) and then implode leaving out the last chunk? Or just substr($s, 0, strrpos( $s, '-'));. It might be enough. You mentioned that these appear at the end of the string, what makes them specific? More than one capital letter?Wiktor Stribiżew
Ok, try $result = preg_replace('/-(?:[^-]*[A-Z]){2,}[^-]*$/', '', $str);. See this regex demo.Wiktor Stribiżew
@WiktorStribiżew yes. i cant delete all last letter blindly as these types of data are only 20% of total rows. so i have to delete only words where two capital letters are thereSteeve
@WiktorStribiżew trying.........Steeve

1 Answers

3
votes

The str_replace is context unaware, nor can you use substr since you need to check for 2 uppercase letters in the last non-hyphen chunk of the text. So you really have to stick to preg_replace regex based replacement.

You may use the following regex:

preg_replace('/-(?:[^-]*[A-Z]){2,}[^-]*$/', '', $str);

See the regex demo.

The pattern matches:

  • - - a hyphen
  • (?:[^-]*[A-Z]){2,} - 2 or more occurrences (due to {2,} limiting quantifier) of a sequence of:
    • [^-]*
    • [A-Z] - an uppercase
  • [^-]* - zero or more chars other than -
  • $ - end of string

PHP:

$str = 'jennie-garth-jennie-garth-inner-city-arts-gala-october-17-2012-If9aSpTWe';
echo preg_replace('/-(?:[^-]*[A-Z]){2,}[^-]*$/', '', $str);