2009-12-14 3 views
6

Я использовал следующий сайт для тестирования PHP регулярного выражения, так что я не должен постоянно загружать: http://www.spaweditor.com/scripts/regex/index.phpPHP preg_replace нежадная неприятность

Я использую следующее регулярное выражение:

/(.*?)\.{3}/ 

на следующей строке (заменив ничего):

Non-important data...important data...more important data 

и preg_replace возвращается:

more important data 

но я ожидаю, что это возвращение:

important data...more important data 

я думал? является не-жадным модификатором. Что тут происходит?

+0

Какие настройки вы используете на сайте? Я просто попробовал это и вернул «не важные данные», как я и ожидал. Ваше регулярное выражение находит первое совпадение и хватается как можно меньше, прежде чем оно сможет найти «...». –

+0

@Doug Neiner: на своем веб-сайте убедитесь, что вы выбрали 'preg_replace' в последнем разделе. Таким образом, я смог воспроизвести результаты ОП. – Asaph

+1

Ах, очень верно. Выбрал не тот. –

ответ

8

Ваш нежелательный модификатор работает как ожидалось. Но preg_match заменяет все вхождения (не жадного) совпадения с заменяющим текстом ("" в вашем случае). Если вы хотите заменить только первый, вы можете передать 1 как необязательный 4-й аргумент (ограничение) на preg_replace (PHP docs for preg_replace). На веб-сайте, который вы связали, это можно сделать, набрав 1 в текстовый ввод между словом «Флаги» и словом «limit».

+1

+1 @ Асафа, отличный ответ. Я выбрал 'preg_match' вместо' preg_replace', когда я попробовал ссылку, так что через меня это запах. Вы, конечно, полностью правы в своем ответе! –

0

только фактический пример решения @Asaph. В этом примере вам не нужна не-жадность, потому что вы можете указать счет. заменить только первое появление @ в строке с маркером

$line=preg_replace('/@/','zzzzxxxzzz',$line,1);