preg_replace, нужна помощь

oksale

Новичок
preg_replace, нужна помощь

PHP:
$txt =preg_replace("/\[(.+?)\s?\|\s?(\S*?)\]/", "some text", $txt);
отбирает в результате

[лизинга недвижимости|?par_id=35]
[многофункционального комплекса «Варшава»|http://site.ru/page.html]
[новый четырехэтажный комплекс площадью 8000 кв. м|?par_id=26]
[самосвалов БЕЛАЗ 7540-В|?par_id=59]
[лизинга горной и карьерной техники|?par_id=59]

Мне нужно, чтобы вторая строка в условие не попадала.

Пробую явно задавать значение второго параметра:
PHP:
"/\[(.+?)\s?\|\?par_id=([0-9]+)\]/"
Но в этом случае объединяются вторая и третья строки.

Подскажите плз, где ошибка.
 

bkonst

.. хочется странного?...
Но в этом случае объединяются вторая и третья строки.
Это точно "строки"? По умолчанию, насколько я помню, preg_replace работает не с файлом целиком, а по строкам.
 

kruglov

Новичок
oksale
Строка может внутри себя содержать символы "]". Если нет - то в этом решение.
 

oksale

Новичок
2 bkonst :

$txt - строка вида:

text text [лизинга недвижимости|?par_id=35] text [многофункционального комплекса «Варшава»|http://site.ru/page.html] text [новый четырехэтажный комплекс площадью 8000 кв. м|?par_id=26] text [самосвалов БЕЛАЗ 7540-В|?par_id=59] text [лизинга горной и карьерной техники|?par_id=59].

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

WP

^_^
Ыыыы
PHP:
$txt = '[лизинга недвижимости|?par_id=35]
[многофункционального комплекса «Варшава»|http://site.ru/page.html]
[новый четырехэтажный комплекс площадью 8000 кв. м|?par_id=26]
[самосвалов БЕЛАЗ 7540-В|?par_id=59]
[лизинга горной и карьерной техники|?par_id=59]
';
$txt =preg_replace('~\[(.+?)\s?\|\s?(?!\?par_id=26)(\S*?)\]~','some text',$txt);
echo $txt;
/*some text
some text
[новый четырехэтажный комплекс площадью 8000 кв. м|?par_id=26]
some text
some text
*/
 

bkonst

.. хочется странного?...
Тогда смотри ответ kruglov - у тебя \S включает символы [].

~

Как и '.+'
 

bkonst

.. хочется странного?...
Если между '|' и '?par_id=' никогда не бывает пробелов - то да.

Кстати, перед '|' может быть более одного пробела?
 

bkonst

.. хочется странного?...
Тогда '\s?\|' можно заменить на '\s*\|'. А можно не менять, так как "лишние" пробелы всё равно поглотятся '([^\[\]]+?)'. Или можно вообще убрать '\s?' - в зависимости от того, как будет использоваться группа '([^\[\]]+?)' в дальнейшем (т.е. будут ли пробелы в её конце мешать или нет).
 
Сверху