Как правильно составить регулярное выражение на php?
Есть строки:
@test1 стоп, не так все @test1 не знаю даже @test1 тест@test1привет @@test1р
Привет, ребят @test2 как дела? @test1@test2@test1 @test1п
Цель: test1 и test2 в данном примере, на их месте может быть любой ник (можно использовать буквы, цифры, символ подчеркивания, точку).
Жирным я выделил то, что должно попадать в выборку (не должно попасть в выборку: с двойной собакой (пример во второй строке); со второго и далее ники, если указаны подряд без пробела (пример в третьей строке); символы по обе стороны от ника (без пробела), которые не подходят под шаблон - буквы, цифры, символ подчеркивания, точка).
Финальная регулярка: https://regex101.com/r/9hfuzi/2/ ([^@]{1}|^)(@[a-zA-z\d]+)
В ней на замену только группа 2, значит preg_replace использовать с маской. $replacement = '$1ЗАМЕНА';
Не совсем правильно работает.
Я написал такое: /@{1}[a-zA-Z0-9_\.?]*/
Но оно некорректно работает с двумя @ - делает две замены,
И когда ники идут друг за другом, нужно брать первый, пока заменяет оба
JimmDiGreez, близко, но если строка начинается с @test - не берет ее, если в середине строки - заменяет корректно
Выделил, которые не заменил: @test1 стоп, не так все @test1 не знаю даже @test1 тест@test1привет @@test1р
Привет, ребят @test2 как дела? @test1 @test2@test1 @test1п
JimmDiGreez, как мне кажется, этот вариант работает лучше - ([^@])@[a-zA-z\d]+
но нужно только сделать что-то с тем, когда ник стоит в самом начале строки.
Сейчас так работает:
@test1 стоп, не так все
@test1 не знаю даже ЗАМЕНА тестЗАМЕНАпривет @@test1р
Привет, ребят ЗАМЕНА как дела? ЗАМЕНА ЗАМЕНА@test1
@test1п
С двумя @ не берет - это хорошо (@@test1р)
Берет первый ник, если два подряд - тоже хорошо (@test2@test1 => ЗАМЕНА@test1)
В данном случае для замены интересует только группа 2.
Ну и по preg_replace php.net/manual/ru/function.preg-replace.php
обрати внимание на подмаски в replacement.
Например в твоем варианте может быть следующий вариант:
$replacement = '$1ЗАМЕНА';
JimmDiGreez, нет, к сожалению, два лишних взяли, их не надо брать dropmefiles.com/DsJ1i
Посмотрите скриншот из пред. комментария, там все правильно, но не берет один ник из первой строки
lexstile, мы как будто разные вещи смотрим. Лан, тогда я сдаюсь, ибо не понимаю, что еще улучшить можно. Сделал бы скрин, да не умею сюда картинки лить. На скрине не та регулярка.
JimmDiGreez, перешел по Вашей ссылке - у Вас там все работает, скопировал оттуда - все так , как и нужно
Спасибо за помощь огромное!
Только один нюанс - захватывает предыдущий символ почему-то,
если пробел - убирает
если символ - символ в неверную кодировку преобразуется �