preg_replace ровно один символ, но не смежные

1

Здравствуйте, мне нужно заменить mediawiki H1 markup (=title=) двойными равными знаками (==Title==).

Однако мне нужно оставить разметку Mediawiki H2 (==title= =) неизменной.

Итак, следующее:

=This is title=    ==This is subtitle== ===This is sub sub title===

должны стать:

==This is title==    ==This is subtitle== ===This is sub sub title===

с помощью:

preg_replace('/(\={1})(.*)\\1/mU', '==\\2==', $s);

однако я получаю

==This is title== ====This is subtitle==== ======This is sub sub title======

Я считаю, что это жадно подходит и знак равенства, появляющийся внутри захвата, и удваивает его... Может ли кто-нибудь помочь?

  • 0
    (Не ваша текущая проблема, а примечание) Ваш модификатор m не используется в этом регулярном выражении. m так ^$ соответствует каждой строке строки. Вы, возможно, хотели s если вы хотели . включить новые строки.
  • 0
    сначала исправьте разметку вашего вопроса;)
Теги:
preg-replace

2 ответа

0
Лучший ответ
(?<!=)(=[^=]+=)(?!=)

Вы можете использовать это и заменить это на =\1=.Посмотреть демонстрацию.

https://regex101.com/r/hE4jH0/32

  • 0
    отрицательный взгляд вперед и отрицательный взгляд сзади, приятно знать!
1

Вы можете использовать образы:

$str = '=This is title=    ==This is subtitle== ===This is sub sub title==='
$repl = preg_replace('/(?<!=)=(?!=)/', '==', $str);
//=> ==This is title==    ==This is subtitle== ===This is sub sub title===

(?<!=)=(?!=) будет соответствовать a = который не соблюдается и которому предшествует =

Ещё вопросы

Сообщество Overcoder
Наверх
Меню