2012-10-24 5 views
2

Код ниже должен заменить все X, за которыми не следует 1 с K, , но он не работает должным образом. Может ли кто-нибудь пролить свет на то, что может быть проблемой? Благодаря!Super simple regex (preg_replace) не работает

<?php 
    $test = "XXXX X1 X2 XXX X1"; 
    $test = preg_replace("/X([^1])/", 'K$1', $test); 

    echo $test; 
?> 

Input: XXXX X1 X2 XXX X1 
Expected output: KKKK X1 K2 KKK X1 

Actual output: KXKX X1 K2 KXK X1 

ответ

5

Матчи не могут пересекаться. Поэтому после нахождения XX двигатель регулярных выражений продолжит поиск третьего символа.

Используйте отрицательный предпросмотр вместо (который не будет частью самого матча, но только гарантировать, что ваш X не следует 1):

$test = preg_replace("/X(?!1)/", 'K', $test); 

Это будет также сделать замены X на очень длинный конец вашей струнной работы (которая раньше не работала бы, потому что [^1] требует, чтобы на самом деле был символ (только не 1).

+0

Это трюк @ m.buettner! (Edit: Ожидание таймера SO пометить так, чтобы я мог пометить ваш ответ как принятый) – KBN

Смежные вопросы