powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения - как выбрать все куски текста кроме подстроки?
56 сообщений из 56, показаны все 3 страниц
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565770
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как выбрать все куски текста кроме подстроки "blbla" например?

например, текст: "_ыв_blbla_к_мв_blbla_аыыв_blbla"
Нужно получить: "_ыв_", "_к_мв_", "_аыыв_"
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565804
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

Код: php
1.
2.
$a = explode('blbla', "_ыв_blbla_к_мв_blbla_аыыв_blbla");
print_r( $a );
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565894
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не регулярное выражение.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565924
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, если подстрока равна "blbla" или "blblb" или "blblc" или "blbld" и т.д., то через explode не получится, нужно через регулярное выражение.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565939
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
$text = preg_replace_callback( "#(.*)(blbla)(.*)#", function ($matches) {echo "<pre>"; print_r ($matches); echo "</pre>"; return ( htmlspecialchars($matches[1])); }, $text );



Вот типа того нужно, только с правильным регуляторным выражением.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38565983
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelНапример, если подстрока равна "blbla" или "blblb" или "blblc" или "blbld" и т.д., то через explode не получится, нужно через регулярное выражение.
что значит ИЛИ? вы в цикле будете перебирать эти варианты? или ходите их сразу описать в одном регулярном выражении?
если в цикле, то explode вам хватит за глаза.
если хотите регуляркой - то у вас проблема. регулярки незаточены искать то что ненужно, они наоборот ищут.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566019
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

возможно вам хватит этого выражения
Код: php
1.
/(?<=^|blbla).+?(?=blbla|$)/i
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566040
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично! Это работает!

Но к сожалению только на подстроках только фиксированной длины. Если подстрока вида: \[img\](.*?)\[/img\] то выходит ошибка:
Warning: preg_replace_callback(): Compilation failed: lookbehind assertion is not fixed length at offset 3742 in /data/www/public_html/sex.ru/index.php on line 224573
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566054
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

что вы вообще делаете? опишите подробно начальную исходную задачу.
а то, есть ощущение что вы решаете совсем не ту задачу. сами себе усложняете жизнь
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566058
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

если парсите bb-коды, то есть куча готовых библиотек, и готовых регулярок. велосипед изобретать нет необходимости
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566070
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне нужно обработать текст функцией htmlspecialchars но при этом не испортить текст внутри тегов ...,
и т.д.

Вот так сделал, но не выбираются куски текста с начала и с конца строки, выбираются только куски между двух тегов:

Код: php
1.
2.
3.
4.
5.
6.
7.
preg_replace_callback( "#^|(\.*?\].*?\[/url\])(.+?)(\.*?\].*?\[/url\])|$#",
function ($matches) {
  echo "<pre>";
  print_r ($matches);
  echo "</pre>";
  return ( htmlspecialchars($matches[1]);
}, $text );
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566077
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин, в предыдущем сообщении теги спарсились.
Не нужно готовых больших библиотек, нужна одна маленькая регулярка.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566085
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavelмне нужно обработать текст функцией htmlspecialchars но при этом не испортить текст внутри тегов ... ,
и т.д.
Это очень сильно отличается от задачи описанной в самом начале. с этого и нужно было начинать.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566092
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

решайте задачу в общем случае. то есть надо найти всЁ что лежит ВНЕ ББ-кодов. неважно каких
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566114
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Код: php
1.
/(?<=^|\])[^\[\]]+?(?=\[|$)/i

так непойдет? выберет все что ВНЕ ЛЮБЫХ ББ кодов
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566117
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

а нет.. выдернет еще и то что внутри открывающего и закрывающего.
в общем либотн надо несколькими регулярками, либо получится большая и медленная
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566158
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю... может это говнокод, но в своё время я решал подобную задачу и делал это так:
1. вызываю preg_match_all для поиска всего, что менять не надо и запоминаю найденные значения
2. вызываю preg_replace и заменяю всё, что надо оставить без изменений, на некую комбинацию, которой заведомо нету в тексте (например "[$$]")
3. в получившейся строке делаю все требуемые замены
4. делаю explode получившейся строки по ставленному ранее разделителю ("[$$]").
5. запускаю for по получившемуся массиву и начинаю сборку новой строки вставляя между уже собранной частью и новой значение из массива, полученного в первом пункте, с соответствующим индексом.

на выходе получается нужное значение. Не думаю что это сильно оптимально... зато быстро и просто (по строке на каждый пункт + строчки 4 на последний, получается до десятка строк на всё).

Как бонус на выходе уже имеем отобранные значения из списка (мало ли, если там какие-то действия аля сохранения файлов надо сделать исходя из значений в тех же [img][/img])
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566174
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. думаю понятно, пункты 1 и 2 используют одну и ту же регулярку. Но на всякий случай уточняю :)
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566249
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D_Pavelмне нужно обработать текст функцией htmlspecialchars но при этом не испортить текст внутри тегов _=http://...]...,
и т.д.

Вот так сделал, но не выбираются куски текста с начала и с конца строки, выбираются только куски между двух тегов:

Код: php
1.
2.
preg_replace_callback( "#^|(\.*?\].*?\[/url\])(.+?)(\.*?\].*?\[/url\])|$#"  ,
function ($matches) {  print_r ($matches); }, $text );


А почему этот вариант не работает?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566720
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр1. вызываю preg_match_all для поиска всего, что менять не надо и запоминаю найденные значения
ну так помогите ТСу, ему как раз нужна эта регулярка))
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566736
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёр1. вызываю preg_match_all для поиска всего, что менять не надо и запоминаю найденные значения
ну так помогите ТСу, ему как раз нужна эта регулярка))

а в чём сложность то? "#\\[img\\].*?\\[/img\\]#"
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566956
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёра в чём сложность то? "#\\[img\\].*?\\[/img\\]#"
в том что у него не только тег img, а еще куча других BB кодов, которые ненадо трогать
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38566990
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите почему это выражение не работает?

Код: php
1.
2.
3.
4.
$text = "начало текстаurl 1]ссылка 1середина текстаurl 2]ссылка 2конец текста";
preg_replace_callback( "#^|\.*?\].*?\[/url\](.+?)\.*?\].*?\[/url\]|$#",
	function ($matches) { echo "<pre>"; print_r ($matches); echo "</pre>"; }, 
	$text );



Выдает:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Array
(
    [0] => 
)

Array
(
    [0] => url 1]ссылка 1середина текстаurl 2]ссылка 2
    [1] => середина текста
)

Array
(
    [0] => 
)



А начало и конец текста не захватывает почему то.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567042
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelПодскажите почему это выражение не работает?
потому что у вас нет выражения описывающего текст сначала и в конце.
^ это просто начало, какие либо данные туда не входят
тоже и с концом строки
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567047
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёра в чём сложность то? "#\\[img\\].*?\\[/img\\]#"
в том что у него не только тег img, а еще куча других BB кодов, которые ненадо трогать

Снова не вижу проблемы :) "#\\[([a-z]+) ([^\\]]+)\\](.*?)\\[/\\1\\]#"
в группах получаем название, параметры и текст.

И кстати, может я конечно где-то невнимательно читал, но разве автор хоть раз упоминал, что у него в тексте есть что-либо кроме img (в последующем заменено на url)?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567051
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрно разве автор хоть раз упоминал, что у него в тексте есть что-либо кроме img

D_Pavelмне нужно обработать текст функцией htmlspecialchars но при этом не испортить текст внутри тегов =http:/ /]...,
и т.д.

Програмёр,
мне ничего доказывать ненужно))
если можете - помогите ТСу решить его конкретную задачу.
а если неможете - то к чему все эти разговоры о простоте решения? я подобную задачу тоже решал. НО Тс то хочет ОДНОЙ РЕГУЛЯРКОЙ. вот хочу посмотреть кто что родит)
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567086
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

/(?<=\]|^)[^\[\]]+?(?=\[[^/]|$)/

а для общего случая учитывающего особенности регулярок, их вложенность и т.д. регулярка будет значительно сложнее
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567089
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelПодскажите почему это выражение не работает?

Код: php
1.
2.
3.
4.
$text = "начало текстаurl 1]ссылка 1середина текстаurl 2]ссылка 2конец текста";
preg_replace_callback( "#^|\.*?\].*?\[/url\](.+?)\.*?\].*?\[/url\]|$#",
	function ($matches) { echo "<pre>"; print_r ($matches); echo "</pre>"; }, 
	$text );



Выдает:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Array
(
    [0] => 
)

Array
(
    [0] => url 1]ссылка 1середина текстаurl 2]ссылка 2
    [1] => середина текста
)

Array
(
    [0] => 
)



А начало и конец текста не захватывает почему то.

извращаемся как можем :)... Если правильно понял то, что Вы хотели написать, то выглядеть это будет так:
#(?:\[^\]]+\].*?\[/url\]|.*?(?=\[^\]]+\].*?\[/url\])|.*)#

Но я лично против таких регулярок. Они вызывают сложности в понимании (представьте я сейчас вместо url напишу что-то универсальное аля [a-z]+ и \1 ... выражение станет просто нечитабельным).

в предложенном случае на выходе получаем
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
Array
(
    [0] => начало текста
    [1] => url 1]ссылка 1
    [2] => середина текста
    [3] => url 2]ссылка 2
    [4] => конец текста
    [5] => 
)
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567137
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёрно разве автор хоть раз упоминал, что у него в тексте есть что-либо кроме img

D_Pavelмне нужно обработать текст функцией htmlspecialchars но при этом не испортить текст внутри тегов =http:/ /]...,
и т.д.

Програмёр,
мне ничего доказывать ненужно))
если можете - помогите ТСу решить его конкретную задачу.
а если неможете - то к чему все эти разговоры о простоте решения? я подобную задачу тоже решал. НО Тс то хочет ОДНОЙ РЕГУЛЯРКОЙ. вот хочу посмотреть кто что родит)

Ну... мало ли что автор хочет )) Регуляркой то распарсить строку можно, но что бы выполнить htmlspecialchars всёровно нужны дополнительные движения. Например элементарно надо заюзать callback. Тем более, что как не крути, но если в состав регулярки входит то, что наоборот нам не требуется, то оно попадёт в результат и нам всеровно нужно будет это исключать. То есть как минимум уже 2 регулярки (одна основная, а вторая для отбрасывания ненужного внутри callback)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php
$text = "начало текста<a href=''>aaa</a> url1]ссылка<a href=''>aaa</a> 1середина текста url2]ссылка 2конец текста";
$text = preg_replace_callback(
  "#(?:\\[([a-z]+)(?: [^\\]]+)?\\].*?\\[/\\1\\]|.*?(?=\\[([a-z]+)(?: [^\\]]+)?\\].*?\\[/\\2\\])|.*)#",
  function ($matches) {
    if(!preg_match("#^\\[([a-z]+)(?: [^\\]]+)?\\].*?\\[/\\1\\]$#", $matches[0])){return htmlspecialchars($matches[0]);}else{return $matches[0];}
  }, 
  $text);
  
echo $text;
?>



Вот... первый html-тэг экранируется (видно сам текст тэга), а второй остаётся без изменений (тот, что внутри bb-тэга).
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567180
мля...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D_Pavel,
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
   $text = 'начало текстаurl 1]ссылка 1середина текста[img=url 2]рисунок 2[/img]конец текста';
   $tags = '(?:img|url)';
   $bbs = "\\[(?:$tags=.+?|/$tags)\\]";
preg_replace_callback(
  "#(?:$bbs|^)(.+?)(?=$bbs|$)#",
  function ($matches) { echo '<pre>'; print_r ($matches[1]); echo '</pre>'; }, 
	$text );
?>

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
начало текста

ссылка 1

середина текста

рисунок 2

конец текста
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567202
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мля...,

ему ненужно то что внутри открытого и закрытого тега
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567251
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение почти найдено. Осталось только подкорректировать немного. http://govnoforum.ru/?k=171
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567261
ну мля...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uмля...,

ему ненужно то что внутри открытого и закрытого тега
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
   $text = 'начало текстаurl 1]ссылка 1середина текста[img=url 2]рисунок 2[/img]конец текста';
   $tags = '(img|url)';
   $bbsmsg = "\\[(?:$tags=(?:.+?)/\g{-1})\\]";
preg_replace_callback(
  "#(?:$bbsmsg|^)(.+?)(?=$bbsmsg|$)#",
  function ($matches) { echo '<pre>'; print_r ($matches[2]); echo '</pre>'; }, 
	$text );
?>

Код: php
1.
2.
3.
4.
5.
начало текста

середина текста

конец текста
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567265
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelРешение почти найдено.
глюкавое оно какоето. и на решение совсем не тянет
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567282
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем там глюк? Я проверил на тестовой строке, вроде работает.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567308
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, ну это то же самое что мля... написал!

Таки в чем его глюк?
Вот во что я его превратил:
Код: php
1.
2.
			$tags = '(?:img|url|code)';
			$htmltext = preg_replace_callback( "#(\G|\[$tags.*?\].*?\[/$tags\])(.+?)(\[$tags.*?\].*?\[/$tags\]|$)#s", function ($matches) { return ($matches[1] . htmlspecialchars($matches[2] . $matches[3] ));}, $row['text'] );



Единственно есть недостаток, что нет проверки на закрытие тега тем же самым тегом который был открыт.
Например
Код: php
1.
 sdf fds fds g [img]

зачтется.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567311
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelА в чем там глюк? Я проверил на тестовой строке, вроде работает.
аа ) ну тогда поздравляю. т.е. вопрос решён полностью?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567317
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, как отредактировать свое сообщение?

Код: php
1.
 sdf fds fds g [/img]
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567319
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uD_PavelА в чем там глюк? Я проверил на тестовой строке, вроде работает.
аа ) ну тогда поздравляю. т.е. вопрос решён полностью?Ну почти. Я выше писал что корректное закрытие тегов не проверяется.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567328
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelЯ выше писал что корректное закрытие тегов не проверяется.
а вы в условии задачи это гдето оговаривали?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567340
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет. я только что придумал это дополнительное условие.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567383
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel
Единственно есть недостаток, что нет проверки на закрытие тега тем же самым тегом который был открыт.
Например
Код: php
1.
 sdf fds fds g [img]

зачтется.

чем мой вариант не устроил?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567414
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Слишком много букв. Но вообще это тоже хороший вариант.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567619
D_PavelСлишком много букв. Но вообще это тоже хороший вариант.
вариант
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$tags = '(img|url)';
$tagsn = '(?:img|url)';
   
$bbsmsg = "\\[$tags=(?:[^[]|\\[(?!/?$tagsn))+\\[/\g{-1}]";
   
$regex = "(?:$bbsmsg|^)\K.+?(?=$bbsmsg|$)";
   
$text = 'начало текстаurl 1]ссылка 1середина текста'
       .'[img=url 2]неправильный рисунок'
       .'ещё середина текста[img=url 3]вроде-бы правильный рисунок[/img]конец текста';
   
preg_replace_callback(
  "#$regex#",
  function ($matches) { echo '<pre>'; print_r ($matches); echo '</pre>'; }, 
  $text );

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Array
(
    [0] => начало текста
    [1] => 
    [2] => url
)

Array
(
    [0] => середина текста[img=url 2]неправильный рисунокещё середина текста
    [1] => url
    [2] => img
)

Array
(
    [0] => конец текста
    [1] => img
)

...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38567862
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelСлишком много букв. Но вообще это тоже хороший вариант.

может тогда так?
Код: php
1.
2.
3.
4.
5.
6.
7.
   $text = "начало текста<a href=''>aaa</a> url1]ссылка<a href=''>aaa</a> 1середина текста url2]ссылка 2конец текста";

   $text = preg_replace_callback(
     "#\\[([a-z]+)[^\\]]*\\].*?\\[/\\1\\]#", 
     function($match){return htmlspecialchars_decode($match[0]);},
     htmlspecialchars($text)
   );



С описанной задачей справляется :)
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568059
z4ik4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всякие извращения с "серьезными" регулярными выражениями жрут в конечном итоге много ресурсов. Здесь нужна простая очередь ака курим напр. тот же phpBB.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568267
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин зачем вы все время слэши удваиваете? Так ведь их смысл теряется!
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568280
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
многабукаф...$regex = "(?:$bbsmsg|^)\K.+?(?=$bbsmsg|$)";
Что такое "\K" ?
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568316
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
многабукаф...
вариант
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$tags = '(img|url)';
$tagsn = '(?:img|url)';
   
$bbsmsg = "\\[$tags=(?:[^[]|\\[(?!/?$tagsn))+\\[/\g{-1}]";
   
$regex = "(?:$bbsmsg|^)\K.+?(?=$bbsmsg|$)";
   
$text = 'начало текстаurl 1]ссылка 1середина текста'
       .'[img=url 2]неправильный рисунок'
       .'ещё середина текста[img=url 3]вроде-бы правильный рисунок[/img]конец текста';
   
preg_replace_callback(
  "#$regex#",
  function ($matches) { echo '<pre>'; print_r ($matches); echo '</pre>'; }, 
  $text );

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Array
(
    [0] => начало текста
    [1] => 
    [2] => url
)

Array
(
    [0] => середина текста[img=url 2]неправильный рисунокещё середина текста
    [1] => url
    [2] => img
)

Array
(
    [0] => конец текста
    [1] => img
)


Это то что надо, спасибо! Напиши свой настоящий номер сотового.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568355
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelЭто то что надо, спасибо!
а как же?
D_PavelСлишком много букв.
))
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568475
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На таком примере выдает ошибку 500!
Код: php
1.
Premature end of script headers: php


Что делать?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
$tags = '(img|url|code)';
$tagsn = '(?:img|url|code)'; 
$bbsmsg = "\[$tags(?:[^[]|\[(?!/?$tagsn))+\[/\g{-1}]";
$regex = "(?:$bbsmsg|^)\K.+?(?=$bbsmsg|$)";

$text='[code]D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
       SF GF G DSF GSDF GD FGD FGS DFGS FD GSDF GSDF GSDF GFD GSD DS `P
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
       DFG DF DF DF HFG HFD HFG HFD HF HFD GHDF GHFD GF HDFGHFG HFD HFG
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD 
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
  D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
  D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
  D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
  D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
      D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
     D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
    D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
   D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
D GDSF GDF GFD GFD GSDF G SF GDSF GSDF GSDF GDSF GDSF GDF GD SD
DS';

preg_replace_callback(
  "#$regex#",
  function ($matches) { echo '<pre>'; print_r ($matches); echo '</pre>'; }, 
  $text );

...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568478
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uD_PavelЭто то что надо, спасибо!
а как же?
D_PavelСлишком много букв.
)) Когда не много букв как в этом варианте - мне нравится.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568529
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavelr uпропущено...

а как же?
пропущено...

)) Когда не много букв как в этом варианте - мне нравится.

Не понимаю я Вас. Вы экономите буквы, убивая читабельность и производительность. Вот сейчас составили регулярное выражение, которое Вам понравилось и уже сколько проблем с отладкой.

D_PavelБлин зачем вы все время слэши удваиваете? Так ведь их смысл теряется!
ровно наоборот... представим, что нам надо выцепить комбинацию "\t" из строки... Только не символ табуляции, а именно 2 символа, что я написал.
Как Вы напишите регулярку? "#\\t#"? а я напишу "#\\\\t#" и буду прав.
Дело в том, что Ваш двойной бэкслеш будет заменён на один (ну как обычно при вводе строки один слэш экранируется другим)... А потом в саму регулярку уйдёт выражение "\t", то есть поиск символа табуляции... И это приведёт к долгому мозгованию что же не так. А представляется сложную регулярку с такой ошибкой? Потому, хоть в данном случае таких нюансов нету, однако я привык писать регулярки именно так, дабы в случае чего не искать часами мелкие ошибки.

Вообще, учитывая что "\" это символ экранирования, его вообще неправильно ставить одинарный. Ведь получается что таким образом мы пытаемся экранировать следующий символ, а не просто ставим слэш. Просто php проверяя, что такой комбинации нету, оставляет слэш нетронутым.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568639
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёрне знаю... может это говнокод, но в своё время я решал подобную задачу и делал это так:
1. вызываю preg_match_all для поиска всего, что менять не надо и запоминаю найденные значения
2. вызываю preg_replace и заменяю всё, что надо оставить без изменений, на некую комбинацию, которой заведомо нету в тексте (например "[$$]")
3. в получившейся строке делаю все требуемые замены
4. делаю explode получившейся строки по ставленному ранее разделителю ("[$$]").
5. запускаю for по получившемуся массиву и начинаю сборку новой строки вставляя между уже собранной частью и новой значение из массива, полученного в первом пункте, с соответствующим индексом.

на выходе получается нужное значение. Не думаю что это сильно оптимально... зато быстро и просто (по строке на каждый пункт + строчки 4 на последний, получается до десятка строк на всё).

Как бонус на выходе уже имеем отобранные значения из списка (мало ли, если там какие-то действия аля сохранения файлов надо сделать исходя из значений в тех же [img][/img])

Можно обойтись одним вызовом регулярки. Я так сделал:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$arr = explode ( $delimiter, preg_replace_callback( "#$regex#si",
	function ($matches) {
		global $arrtag;
		$arrtag[] = $matches[0];
		return ( $delimiter );
	},
	$originaltext ) );
foreach ($arr as $key => $text) {
	$newtext .= "$text{$arrtag[$key]}";
}
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568645
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрПросто php проверяя, что такой комбинации нету, оставляет слэш нетронутым. А! Так вот в чем дело! Я думал так надо раз ПХП не выдает ошибку. Перл бы выдал.
...
Рейтинг: 0 / 0
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #38568702
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл добавить еще global $delimiter.
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения - как выбрать все куски текста кроме подстроки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]