Во-первых, для preg_replace
необходимо разделить ваше регулярное выражение на /
, например:
/\b((?:https: ... etc etc)/
Во-вторых, поскольку вы разделяете свои регулярные выражения с помощью /
, вы должны экранировать любые /
с обратной косой чертой. Итак https://
-> https:\/\/
.
В-третьих, ваши модификаторы (?i)
идут после косой черты:
`/\b((?:https: .. etc etc)/i`
Try (изменения сделаны: экранировано /
, перенесено регулярное выражение из (?i)regex
в /regex/i
):
$pattern = '/\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)((?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))*)/i';
$textStr = preg_replace($pattern, "google.com", $textStr);
echo $textStr;
Теперь, поскольку $pattern
соответствует всему URL, вы просто получите:
"Test string contains google.com
google.com
google.com
google.com
google.com
more urls google.com some other text"
В общем, я рекомендую либо ответ @ Ampere (но он имеет более слабое регулярное выражение, чем ваш оригинал), либо использовать захватные скобки и обратные ссылки, чтобы сделать что-то вроде preg_replace($pattern,'google.com/\2',$textStr)
(но измените соответствующие захватные скобки, так как это будет не работает с вашей текущей схемой захвата).
Этот сайт полезен для тестирования.