I have some strings e.g.
$str = '/some-folders/../pattern,replacement-area';
$str = '/some-folders/../pattern,also-replacement-area/parameter-one';
I want to replace all the occurrences of -
to ~
if exists in the replacement area that is between /pattern,
and optional /
The result must be
/some-folders/../pattern,replacement~area
/some-folders/../pattern,also~replacement~area/parameter-one
I just know about simple str_replace
$str = str_replace("-","~",$str);
Please provide efficient code as it will be run many times on a page.
CodePudding user response:
You can search using this regex:
(?:/pattern,|(?!^)\G)[^\n/-]*\K-
and replace using ~
RegEx Details:
(?:
: Start non-capture group/pattern,
: Match/pattern,
|
: OR(?!^)\G
: Start from end of previous match
)
: End non-capture group[^\n/-]*
: Match 0 or more of any character that is not/
and-
and not a line break\K
: reset all the match info-
: Match a-
CodePudding user response:
Always with the "glue" feature (this time expressed with the A modifier instead of the \G
escape sequence), but with a different pattern structure that avoids the alternation:
echo preg_replace('~(?:^.*?/pattern,)?(?!^)[^/-]* \K-~A', '~', $str);
Notice: instead of the possessive quantifier here [^/-]*
, you can also use the (*COMMIT)
backtracking control verb that is interesting to quickly abort the research when there's no dash in the string:
~(?:^.*?/pattern,)?(?!^)[^/-]*\K(*COMMIT)-~A