Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не отрабатывает регулярное выражение в скрипте 
V
    Опции темы
V0fka
Дата 10.4.2016, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Есть строка вида:
Цитата
что-то

[tag1]qwe[/tag1]
[tag2]qwe[/tag2]

что-то ещё


Мне нужно проверить, что в строке содержится [tag...] [/tag...], после этого обработать строку внутри и заменить это на [myReplaceTag]Новый текст: qwe[/myReplaceTag]. На данном этапе проблема в том, что не могу определить, что строка содержит то, что мне нужно.

Написал регулярное выражение для поиска тегов. Выглядит оно так: \[tag(\d+?)\](.*?)\[/tag(\1)\] . На одном из онлайн "проверяльщиков" проверил, работает нормально. Вставляю строку в скрипт:

Код

preg_match_all("/\[tag(\d+?)\](.*?)\[\/tag(\1)\]/sm", $txt, $output)


Но она возвращает 0, вместо 4, как я ожидаю и как мне показывает "проверяльщик".

Подскажите, пожалуйста, что не так?
PM MAIL   Вверх
ksnk
Дата 10.4.2016, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Нужно вместо \1 писать \\1. Это такое доброе чудо от php, `двойные кавычки` называется. Некоторые слеши нужно удвоять, некоторые учетверять...
Можно заменить двойные на одинарные, так таких чудес можно избежать, но не всегда smile 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 10.4.2016, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Спасибо, заработало!

А про эти приколы можно где-то почитать: где надо заменять, где не надо, где на 2, где на 4?
PM MAIL   Вверх
igorold
Дата 10.4.2016, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



что означает \1 ??? чем это отличается от 1
может вы хотели написать \d

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
igorold
Дата 10.4.2016, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



а это что: 
Код
\d+?
 ?



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
ksnk
Дата 10.4.2016, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(igorold @  10.4.2016,  19:10 Найти цитируемый пост)
что означает \1 ??? чем это отличается от 1
может вы хотели написать \d

http://php.net/manual/ru/regexp.reference.escape.php
Цитата

Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее. Вне символьного класса PCRE воспринимает обратный слеш и следующие за ним цифры как десятичное число. Если полученное значение меньше десяти, либо если шаблон содержит по меньшей мере такое же количество предшествующих текущей позиции подмасок, вся конструкция интерпретируется как ссылка на подмаску. Более детальное описание будет приведено ниже при обсуждении механизма работы подмасок.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 10.4.2016, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(V0fka @  10.4.2016,  19:09 Найти цитируемый пост)
А про эти приколы можно где-то почитать: где надо заменять, где не надо, где на 2, где на 4? 

В основном - метод научного тыка.  smile 
В описаниях регулярок на php.net стоит поискать двойные слеши и посмотреть в каких случаях они используются.
Нужно стараться использовать одинарные кавычки где это возможно, просто для минимизации странных явлений.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
igorold
Дата 11.4.2016, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



спасибо ... не знал :-)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
V0fka
Дата 11.4.2016, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, под "использовать одинарные кавычки" вы имеете ввиду вместо

Код

preg_match_all("/\[tag(\d+?)\](.*?)\[\/tag(\1)\]/sm", $txt, $output)


писать

Код

preg_match_all('/\[tag(\d+?)\](.*?)\[\/tag(\1)\]/sm', $txt, $output)


?
PM MAIL   Вверх
ksnk
Дата 11.4.2016, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



V0fka, Да. 
Можно еще немного сократить регулярку, из эстетических соображений.
Код

preg_match_all('/\[tag(\d+)\](.*?)\[\/tag\1\]/sm', $txt, $output)

Убран вопросик после \d+? так как жадного \d просто не бывает и выкинута захватывающая маска вокруг финального \1, так как его значение на самом деле уже известно.
Можно еще на байт сократить регулярку, если начать ее не со слеша, а с другого символа, но это пусть останется как задание на дом  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 12.4.2016, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(ksnk @  11.4.2016,  11:30 Найти цитируемый пост)
V0fka, Да. 

Ясно, спасибо!

Цитата(ksnk @  11.4.2016,  11:30 Найти цитируемый пост)
Убран вопросик после \d+? так как жадного \d просто не бывает и выкинута захватывающая маска вокруг финального \1, так как его значение на самом деле уже известно.

Спасибо!

Цитата(ksnk @  11.4.2016,  11:30 Найти цитируемый пост)
Можно еще на байт сократить регулярку, если начать ее не со слеша, а с другого символа, но это пусть останется как задание на дом

В одной из моих предыдущих тем _zorn_ посоветовал вместо / использовать #, мне это понравилось и я теперь стараюсь использовать решетку. Но просто сайт, на котором я регулярки проверяю обрамляет итоговое выражение слешами. Ну я оттуда сюда так и копипастю. smile 

В общем, вопрос вроде как решен. ksnk, спасибо за помощь!
PM MAIL   Вверх
ksnk
Дата 12.4.2016, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(V0fka @  12.4.2016,  10:12 Найти цитируемый пост)
В общем, вопрос вроде как решен

Решенные вопросы отмечаются специальной кнопкой `Пометить как решенный` в заголовке темы.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.