Войти

Показать полную графическую версию : регулярные выражения


Страниц : [1] 2 3 4

Ginger
21-12-2004, 17:51
Помогите, пожалуйста, составить рег. выражение:
Вот пример кода, который не работает:

$text = "some text with image <img src=”../user_img/093470394746/image.gif”> goes here for testing purposes";
preg_match('/user_img\/ ? ([0-9]{12})\/ ',$text,$result);

foreach( $result as $v)
echo "res - ".$v;

суть заключается в том, что нужно в данном тексте найти название директории, состоящие исключительно из цифр, и которое _всегда_ находиться после «user_img/».
Вернуть его в переменную.
Количество цифр всегда 12. Читать нужно либо 12 цифр подряд, либо до forward slash «/».

vadimiron
21-12-2004, 20:51
preg_match("/user_img\/(\d{12})/",$text,$result);

У меня вот так вышло
сама цифра будет в $result[1]

Ginger
19-01-2005, 17:56
vadimiron, spasibo za reshienie =)

est eshio vopros po vyrazheniem
(sorry za translit, no formy u menia opiat net...)

$searches = array("[\']", "'class=[^\s|>]'si");
$replaces = array("`" , "");

vopros kasaetsia reguliarnogo vyrazhenija - 'class=[^\s|>]'si

delo v tom chto ja xochu udaliat iz html koda vse class'y (i style tozhe, no eto potom po primeru mozhno sdelat)

pri etom ja xochu chto by probel pered class= udalialsia, a posle ego ostavalsia esli est
<p class="amega" align=right>

kod kotoryj napisala ja udaliaet slovo class= esli imia klassa ukazano v kavychkax - class="amega", ostajotsia "amega"
i udaliaet class= i pervuju bukvu posle, esli class bez kovychek -
class=amega, ostajotsia mega

ja xochu chtob skript iskal slovo class= i udalial ego vmeste s tom chto idiot posle = do probela ILI zakryvajushego >
(ved mozhet byt <p class=bla> )

podskazhite gde eto popravit?
ja uzhe chto tolko ne isprobovala.. to on uimenia ves tekst udaliat, to nichego, to tolko 'class=' ...

vadimiron
22-01-2005, 01:10
/\sclass=['\"]\w{0,50}['\"]/
вот такой паттерн у меня получился, надеюсь будет работать :)
он работает как с ", так и с ', а также с их комбинацией

vadimiron
22-01-2005, 14:13
Исправление: если там вообще нет кавычек, то есть типа class=lolka, то код не будет работать, так что вот пример для любого случая, то есть независимо от того, есть ли кавычки:

preg_match("/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/",$text,$result);

тогда весь найденный паттерн будет в $result[0];

Ginger
25-01-2005, 14:51
vadimiron
спасибо, что снова помогаешь ))

проверила твой код - он удаляет не толко класс, но и от < до > ))
такое можно намного короче написать ))
мне нужно чтоб хтмл таги оставались не тронутыми

vadimiron
25-01-2005, 20:31
странно, у меня всё получалось, тогда ещё подумаю

vadimiron
25-01-2005, 23:46
Ginger
Может ты удаляешь как то не так
Вот мой пример, который работает у меня на компе:

$text = "some text with image <p class='lolki' left='go'> goes here for testing purposes<br>
some text with image <h1 width=25 class=\"prot\"> goes here for testing purposes";

$text=preg_replace("/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/","",$text);

echo $text;

Вывод:

some text with image <p left='go'> goes here for testing purposes<br>
some text with image <h1 width=25> goes here for testing purposes

Вроде так же надо было??

Ginger
27-01-2005, 16:32
vadimiron

вот так делаю.

$searches = array("[\']","/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/");
$replaces = array("`", "");
$text = preg_replace($searches,$replaces,$text);

в тексте:
<p class="lala">klmn oprst</p>

остаётся:
klmn oprst</p>

vadimiron
27-01-2005, 16:35
:)
Так почему ты не так сделаешь, как я это делаю
:)

Ginger
27-01-2005, 16:38
vadimiron
потому что я тут только часть в аррей указала,
а там очень много других рег. выр.
которые работают =)

vadimiron
27-01-2005, 23:49
вот так делаю.
Код:
$searches = array("[\']","/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/");
$replaces = array("`", "");
$text = preg_replace($searches,$replaces,$text);


Так в этом случае сначало меняются кавычки, а уже потом идёт поиск по паттерну, я же не учитывал ещё и такой вид ковычек, как `
Надо либо поменять местами, либо лучше было бы дописать такой вид ковычек в ['\"], попробуй вот так:


$searches = array("[\']","/\sclass=(([`'\"]\w{0,50}[`'\"])|(\w{0,50}))/");
$replaces = array("`", "");
$text = preg_replace($searches,$replaces,$text);

mrcnn
28-01-2005, 08:43
в 1 случае у меня получилось:
$text = "some text with image <img src=”../user_img/093470394746/image.gif”> goes here for testing purposes";
preg_match('/\w+\/(\d+)\// ',$text,$result);
print $result[1];

во 2 случае:
$text="<p class = \"amega\" align = center>";
$text=preg_replace('/(.*) class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?(.*)/', "\\1\\7", $text);
print $text;

Это будет работать вне зависимости от того:
1) есть ли после p class="amega" закрыващий тэг или нет
2) строка заключена в ' или в " или в ` или без кавычек
3) есть ли перед и после = пробелы вне зависимости от их количества

Это не будет работать, если перед закрывающим тэгом находятся пробелы.

vadimiron
28-01-2005, 13:20
mrcnn
Одно только замечание, (.*) обознаечает, насколько я понимаю, бесконечное повторение любого элемента, предположим переменная $text содержит целую страницу HTML, где-то 5000 знаков, и первый class попадается только на 3000-чном знаке, тогда внутренняя переменная $1 функции preg_replace будет содержать все знаки до этого 3000-чного, что является не очень эффективным способом поиска, к этому надо ещё прибавить, что фугкции регулярок и без того притормаживают, так что я посоветовал бы искать напрямую class, и заменять его пустым знаком (то есть удалять)

mrcnn
28-01-2005, 13:47
vadimiron:
Да, Вы абсолютно правы, с этой точки зрения не совсем эффективно.
И у меня появилось еще одно собственное замечание - если в строке несколько паттернов
(например, $text = "<p class = \"lala\" align='center'>klmn oprst</p> <p class = \"lala\" align='center'>klmn oprst</p>" ; )
, то заменен будет только один из них.

Итого, с учетом обоих замечаний, получается так:
while (preg_match('/class(\s+)?=/', $text)){
$text=preg_replace('/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/', "", $text);
}

Ginger
01-02-2005, 18:04
mrcnn
на скол'ко я поняла этот код:
'/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/'
не учитывает того, что класс может быт' написан заглавными буквами?

тепер если я хочу ещё и style искат'? тогда нужно так?:
'/ (class|style)(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/'

mrcnn
02-02-2005, 04:14
Ginger
на скол'ко я поняла этот код:
'/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/'
не учитывает того, что класс может быт' написан заглавными буквами?
Да, не учитывает. Чтобы учитывал, нужно добавить модификатор i в конец

'/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/i'

тепер если я хочу ещё и style искат'? тогда нужно так?:
'/ (class|style)(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/'
Все верно

Ginger
02-02-2005, 19:39
Вот полностью аррей с прегами. Рабочий вариант.

$searches = array("[\']","'<h[4-5][^>]*?>'si","'</h[4-5]>'is","'<h[1-3][^>]*?>'si","'</h[1-3]>'si","'<hr[^>]*?>'si", '/ (class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si');
$replaces = array("`" ,"<h4>" ,"</h4>" ,"<h3>" ,"</h3>" ,"<hr size=\"1\">","");
$text = preg_replace($searches,$replaces,$text);

Do:
<pre CLASS=KLMN>Proveriaem rabotu pregov</pre>
<p class="klmn">Etot s kavychkami</p>
<p class=clas>Etot class bez kovychek</p>
<p class='clas'>Etot class s odinarnymi kovychkami</p>
<pre STYLE=KLMN>Proveriaem rabotu pregov</pre>
<p style="klmn">Etot s kavychkami</p>
<p style=clas>Etot class bez kovychek</p>
<p style='clas'>Etot class s odinarnymi kovychkami</p>

Posle:
<pre>Proveriaem rabotu pregov</pre>
<p>Etot s kavychkami</p>
<p>Etot class bez kovychek</p>
<p>Etot class s odinarnymi kovychkami</p>
<pre>Proveriaem rabotu pregov</pre>
<p>Etot s kavychkami</p>
<p>Etot class bez kovychek</p>
<p>Etot class s odinarnymi kovychkami</p>

А в моём скрипте текст берётся из формы и обрабатывается прегами =)

Я балда, что сразу об этом не сказала..
Просто сегодня копалась с addslashes() stripslashes() и за одно всё же посмотрела, как работает $_POST – выяснила, что он автоматом слаши добавляет…

Спасибо огромное mrcnn, vadimiron, что помогли составить преги. =)) (k)

Prisoner
03-02-2005, 08:49
Ginger, маленькая ремарочка. Слэши в приходящие данные будут вставляться в соответствии с установками в php.ini:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

Ginger
04-02-2005, 15:07
Prisoner
это я уже знаю. =))
тол'ко на сервере ини редактироват нет возможности =))


ALL
=))
если желание ест' давайте усложним задачу?

стили и класс нужно удалят' везде кроме тага <pre>

я знаю, что нужно испол'зоват ^ , но не знаю как =))




© OSzone.net 2001-2012