Using:
preg_replace(pattern, replacement, subject)
I’d like to replace, case-insensitively, the text contained in $My_String
, which I can achieve with:
preg_replace('/('.$My_String.')/i', '<strong>$1</strong>', $My_Text);
If $My_String
is alpha beta gamma delta, this will identify:
- alPhA beTa GammA DeLta
- aLpHa bEta gAMma delTa
etc.
So far, so good. But any spaces and hyphens in $My_String
must also be regarded as equivalent.
So the preg_replace()
function also needs to identify case-insensitive versions of this entire set:
- alpha beta gamma delta
- alpha beta gamma-delta
- alpha beta-gamma delta
- alpha beta-gamma-delta
- alpha-beta gamma delta
- alpha-beta gamma-delta
- alpha-beta-gamma delta
- alpha-beta-gamma-delta
I’m genuinely not sure how to go about this.
I can get as far as:
1. Make a copy of $My_String
:
$My_String_Copy = $My_String
2. Replace all the spaces with ¦
:
$My_String_Copy = str_replace(' ', '¦', $My_String_Copy);
3. Replace all hyphens with ¦
:
$My_String_Copy = str_replace('-', '¦', $My_String_Copy);
4. Split $My_String_Copy
at every occurrence of ¦
:
$My_String_Copy_Array = explode('¦', $My_String_Copy);
This will give me an array:
$My_String_Copy_Array = [ 'Alpha', 'Beta', 'Gamma', 'Delta' ];
Which I can repeatedly loop through to derive the entire set above, as an array.
After that I can run yet another loop, in which, in each iteration, I can run:
preg_replace('/('.$Entire_Set[$i].')/i', '<strong>$1</strong>', $My_Text);
targeting, in turn, each element of the entire set above.
That’s as far as I’ve got. But I’m sure there must be a smarter, more efficient way to go about this.
If I can possibly avoid it, I really don’t want to create an array containing every single hyphen / space permutation of $My_String
.
Example Input and Output
String Variable:
$My_String = 'alpha beta gamma delta';
Input:
My codephrase is alPha Beta-GaMMa deLTa and your codephrase is ALpha-beTA gAmmA-DElta.
Output:
My codephrase is <strong>alPha Beta-GaMMa deLTa</strong> and your codephrase is <strong>ALpha-beTA gAmmA-DElta</strong>.
Advertisement
Answer
If you want to treat spaces and hyphens the same, then simply replacing any occurrence of either with [ -]
should be sufficient:
$samples = [ "My codephrase is alPhA beTa GammA DeLta and your codephrase is aLpHa bEta gAMma delTa", "My codephrase is alpha beta gamma delta and your codephrase is alpha beta gamma-delta", "My codephrase is alpha beta-gamma delta and your codephrase is alpha beta-gamma-delta", "My codephrase is alpha-beta gamma delta and your codephrase is alpha-beta gamma-delta", "My codephrase is alpha-beta-gamma delta and your codephrase is alpha-beta-gamma-delta", ]; $My_String = "alpha beta gamma delta"; $My_String = str_replace([" ", "-"], "[ -]", $My_String); foreach ($samples as $My_Text) { echo preg_replace("/b($My_String)b/i", "<strong>$1</strong>", $My_Text) . "n"; }
Output:
My codephrase is <strong>alPhA beTa GammA DeLta</strong> and your codephrase is <strong>aLpHa bEta gAMma delTa</strong> My codephrase is <strong>alpha beta gamma delta</strong> and your codephrase is <strong>alpha beta gamma-delta</strong> My codephrase is <strong>alpha beta-gamma delta</strong> and your codephrase is <strong>alpha beta-gamma-delta</strong> My codephrase is <strong>alpha-beta gamma delta</strong> and your codephrase is <strong>alpha-beta gamma-delta</strong> My codephrase is <strong>alpha-beta-gamma delta</strong> and your codephrase is <strong>alpha-beta-gamma-delta</strong>