powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения - как выбрать все куски текста кроме подстроки?
25 сообщений из 56, страница 2 из 3
Регулярные выражения - как выбрать все куски текста кроме подстроки?
    #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
25 сообщений из 56, страница 2 из 3
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Регулярные выражения - как выбрать все куски текста кроме подстроки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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