IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   PHP Регулярные Выражения (http://www.imho.ws/showthread.php?t=75850)

Psionic Vision 16.12.2004 03:45

PHP Регулярные Выражения
 
Как с помощью регулярных выражений преобразовать

Код:

[ b ]text[/ b ] (без пробелов)
в

Код:

<b>text</b>
?

Спасибо.
Вообще, где можно почитать про эти выражения?

Fiery_Fenix 16.12.2004 04:11

Например вот так:
$string=preg_replace("/\[b\]/si","<b>",$string);
$string=preg_replace("/\[\/b\]/si","</b>",$string);

Hubbitus 16.12.2004 14:46

А может просто и сразу?:
PHP код:

$ttt "[b]text[/b]";
$ttt preg_replace('/\[(\/?\w+)\]/si'"<\\1>"$ttt); 

Цитата:

Neo:Вообще, где можно почитать про эти выражения?
http://www.imho.ws/showpost.php?p=721825&postcount=9

Psionic Vision 17.12.2004 01:54

Спасибо. А как заменить

[color = AAA]text[/color]

на

<font color='AAA'>text</font>?

И по какому приницу, вообще говоря, работает \\1?

Psionic Vision 17.12.2004 03:31

Т.е. мне не ясен ключевой момент:

Каким образом
[color = AAA]text[/color]
заменяется на
<font color='AAA'>text</font>
а не на
<font color='[color = AAA]'>text</font>

каким образом указывается, какую часть совпадения переносить :S

Fiery_Fenix 17.12.2004 04:38

\\0 - вся строка в которой найдено совпадение
\\1 - это первое найденое совпадение с шаблоном (ограниченое круглыми скобками)
и т.д. слева направо по круглым скобкам.
таким образом для указания захватываемого (переносимого) паттерна необходимо заключить его в круглые скобки и после обратится к нему по его порядковому номеру.
ЗЫ Для _не_ захватывания используется (?:паттерн).

Psionic Vision 17.12.2004 05:26

Fiery_Fenix
Ага! Теперь мне наконец все понятно :) Лови звездочку.

P.S. А квадратные скобочками совпадениями не являются?

Sheryld 17.12.2004 11:09

квадратные скобочки - это обычно группа символов, пример:

[a-zA-Z0-9] - все латинские буквы и цифры

p.s. в данном случае скобки экранированы слешем, посему это обычные символы.

Hubbitus 17.12.2004 11:11

Цитата:

Neo:
А квадратные скобочками совпадениями не являются?
Являются конечно, если в шаблоне, только в моем примере они стоят ВНЕ круглых и поэтому в переменную результата не включены.

А если ты имеешь ввиду конструкцию [шаблон] то это обозначает класс символов.

Sheryld 17.12.2004 11:15

а как скажем сделать такую штуку:

есть дата: (d-m-y H:i) нужно месяц заменить на словесный аналог, русский.

как бы это сделать одной строкой?

Hubbitus 17.12.2004 21:21

Функции date(), strtotime() и русская локаль тебе помогут.

А раз в этой теме, может тебе нужно именно регулярным выражением? Тогда приблизительно так:
PHP код:

$str_date=preg_replace(array('/(^\d{2}\-)01/si','/(^\d{2}\-)02/si','/(^\d{2}\-)03/si','/(^\d{2}\-)04/si','/(^\d{2}\-)05/si','/(^\d{2}\-)06/si','/(^\d{2}\-)07/si','/(^\d{2}\-)08/si','/(^\d{2}\-)09/si','/(^\d{2}\-)10/si','/(^\d{2}\-)11/si','/(^\d{2}\-)12/si'),array('\\1Январь','\\1Февраль','\\1Март','\\1Апрель','\\1Май','\\1Июнь','\\1Июль','\\1Август','\\1Сентябрь','\\1Окрябрь','\\1Ноябрь','\\1Декабрь'),$str_date); 

Но, ИМХО, это изврат, зато в одну строчку!

Если уж нужно на регах, то помоему лучше уж так: (хоть и в 2 строки):
PHP код:

$month=array(1=>'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Окрябрь','Ноябрь',12=>'Декабрь');
$str_date preg_replace('/^(\d{2}\-)(\d{2})/esi''"\\1{$month[\\2]}"'$str_date); 

P.S. IMHO, не нужно изобретать велосипед для усложнения жизни, лучше наоборот, поэтому первый вариант (со специально реализованными разработчиками функциями)) я считаю самым предпочтительным!

Psionic Vision 18.12.2004 00:34

Посмотрите, я правильно сформировал выражение?
(с точки зрения безопастности)

PHP код:

$bbcode preg_replace('/\[color=([#]?[A-z]*)\](.*)\[\/color\]/'"<font color='\\1'>".htmlspecialchars("\\2",ENT_QUOTES)."</font>"$bbcode);



Может, что-нибудь стоит подкорректировать?

Sheryld 18.12.2004 01:55

у меня почему-то через локаль не заработало:) я так изначально и хотел.

в итоге сделал просто:

массив с месяцами($monthArray), из даты берем месяц, как число($currentMonth) -> $monthArray[$currentMonth-1], далее собираем дату.

регулярки - ради спортивного интереса:)

p.s. изначально у меня был такой вариант, но я не допер вот до этого:

"\\1{$month[\\2]}"', что в данном случае значат {} ?

Psionic Vision 18.12.2004 02:48

Sheryld
>> что такое { }?
Ограничитель переменной $month[]...

А что насчет моего последнего поста?

Fiery_Fenix 18.12.2004 04:04

Я бы поставил модификаторы s и i в конце паттерна -> "...color\]/si"
s - dot (точка) соответствует всем символам, включая символы новой строки (а вдруг текст многострочный?)
i - буквы в патэрне совпадают независимо от регистра
по поводу ([#]?[A-z]*), а цвет точно только в буквеном эквиваленте? да и знаки ? и * "жадные", я бы написал так: ([#]??[0-9A-z]*?).

Psionic Vision 18.12.2004 06:37

А что значит "жадные"?

Цитата:

а цвет точно только в буквеном эквиваленте
не-а, об этом я не подумал :)

Hubbitus 18.12.2004 13:46

Цитата:

Sheryld:
в итоге сделал просто:

массив с месяцами($monthArray), из даты берем месяц, как число($currentMonth) -> $monthArray[$currentMonth-1], далее собираем дату.
Дак я именно так и сделал тебе в регулярном выражении, только для удобства начал массив с 1, чтобы не вычитать.

про {} тебе ответил Neo хочу лишь отметить что они в данном случае необходимы потомц что в строке обращение к массивеу.
P.S. Никого не хочу обидеть но не кажется Вам странным задавать подобные вопросы, незная элементарного - способов обращения к переменным в языке? :confused: :biggrin:

Цитата:

Neo:
А что значит "жадные"?
"Жадные" значит что поумолчанию совпадают с максимально возможным фрагментом подпадающим под выражение, в твоем случае это значит что выражению .* будет сопоставлена вся оставшаяся строка, ничего не оставив паттерну \[\/color\].

P.S.2 И про жадность и про ее ограничение в тех ссылках что я дал подробно описано, неужели так сложно прочитать пяток страниц текста с примерами...

Psionic Vision 18.12.2004 18:24

Цитата:

Hubbitus:
"Жадные" значит что поумолчанию совпадают с максимально возможным фрагментом подпадающим под выражение, в твоем случае это значит что выражению .* будет сопоставлена вся оставшаяся строка, ничего не оставив паттерну \[\/color\].
Понятно. Странно, каким образом тогда это работает?

Цитата:

P.S.2 И про жадность и про ее ограничение в тех ссылках что я дал подробно описано, неужели так сложно прочитать пяток страниц текста с примерами...
Сейчас почитаю :) Просто быстрее получить ответ.

Hubbitus 18.12.2004 23:35

Цитата:

Neo:
Понятно. Странно, каким образом тогда это работает?
Прошу прощения, я не совсем правильно выразился и ввел видимо в заблуждение, конечно в данном случае шаблону \[\/color\] будет нормально все сопоставлено, и в данном случае кстати не обязательно ограничивать жадность квантификатора. Это принципиально в более сложных шаблонах, когда есть альтернативы и необязательные паттерны..., например, лень придумывать, поэтому процитирую:

Цитата:

Классический пример проблем, которые могут возникнуть в связи с такой особенностью квантификаторов - нахождение комментариев в C-программах. Комментарием считается произвольный текст, находящийся внутри символьных комбинаций /* и */ (при этом, символы '/' и '*' также могут быть частью комментария). Попытка найти комментарии при помощи шаблона /\*.*\*/ в строке /* первый комментарий */ не комментарий /* второй комментарий */ закончится неудачей, поскольку указанный шаблон соответствует всей строке целиком (из-за жадности кватификатора '*').
Это достаточно часто используется, может потребоваться к примеру при обработке одинаковых вложенных тегов.

Psionic Vision 19.12.2004 01:26

Понятно..
Значит, и тут могут быть проблемы:
[color= aaa ][color = aaa]bbb[/color]aaaaaaaa[/color ]

Верно?

Hubbitus 19.12.2004 13:41

Цитата:

Neo:
Значит, и тут могут быть проблемы:
[color= aaa ][color = aaa]bbb[/color]aaaaaaaa[/color ]

Верно?
Ну вроде того.
Скажем так, просто это нужно учитывать, и понимать как работет, чтобы их не возникло ;)

Psionic Vision 19.12.2004 20:22

ОК, но у меня эта конструкция с вложениями не работает
[color=red ][color=blue ]aaa[/color ]aaa[/color ]
дает
[color=blue ]aaa[/color ]aaa
%(

Почему?

Hubbitus 20.12.2004 00:57

Дак она какраз и работает, посмотри, она правильно выбрала текст и обработала его.
Я немного о другом говорил, когда про вложенность толковал.

А данную задачу, поскольку она простая и вполне может быть разбита на фрагменты легко, проще всего решить так (ну чтобы не обрабатывать строку в цикле или рекурсивно):
PHP код:

$bbcode '[color=red][color=blue]aaa[/color]aaa[/color]';
$bbcode preg_replace(array('/\[color=([#]?[A-z]*)\]/''/\[\/color\]/'), array("<font color='\\1'>""</font>"), $bbcode); 


Psionic Vision 21.12.2004 00:08

Hubbitus
Понял, спасибо. Про возможность замены с использованием массивов не знал :)

shuron 21.12.2004 20:54

Про регулярные выражения читал тут:
http://www.softtime.ru/bookphp/gl7_12.php
тнестировал тут:
http://www.javaregex.com/test.html

всё понравилось... ;)

CriS 27.12.2004 05:43

Есть ещё один вопрос! :help:

Возможно ли с помощью регулярных выражений сделать заглавными первые буквы предложений из определённого текста?

Вот собственно и весь вопрос... Если да, то как именно?
Заранее благодарен за помощь! :молись:

Sheryld 27.12.2004 12:46

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

можно сделать так(это по-сути только отображение):

1. выделяешь первую букву.
2. меняешь ее(на <span class=capitalizeClass>я</span>блоко)

а в классе(css):
Код:

.capitalizeClass
{
  text-transform: capitalize;
}

небольшой примерчик:

Код:

<style>
.capitalizeClass
{
 text-transform: capitalize;
}
</style>
<?
        $wordsArray =array("вася", "пупкин", "крутой", "программер");
       
        foreach($wordsArray as $word)
        {
                echo preg_replace("/^([\w]){1}/si","<span class=capitalizeClass>\\1</span>",$word) . "<BR>";
        }
?>


Hubbitus 27.12.2004 13:23

Цитата:

CriS:
Есть ещё один вопрос!

Возможно ли с помощью регулярных выражений сделать заглавными первые буквы предложений из определённого текста?
Ну если считать что предложение всегда правильно написано и заканчивается точкой, то конечно можно и просто:
PHP код:

$text 'first sentence. second sentence.';
$text preg_replace('#(\w)(.*?\.)#ie'"strtoupper('\\1').'\\2'"$text); 

Если нет, то вообще как тогда определить где начало предложания а где конец?

Для работы с русскими символами смотрите МАН и настройки локали сервера.

Sheryld 27.12.2004 14:42

точно, а я и забыл про эту функцию:)


Часовой пояс GMT +4, время: 07:19.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.