регулярные выражения
Помогите, пожалуйста, составить рег. выражение:
Вот пример кода, который не работает: Код:
$text = "some text with image <img src=”../user_img/093470394746/image.gif”> goes here for testing purposes"; Вернуть его в переменную. Количество цифр всегда 12. Читать нужно либо 12 цифр подряд, либо до forward slash «/». |
PHP код:
сама цифра будет в $result[1] |
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=' ... |
Код:
/\sclass=['\"]\w{0,50}['\"]/ он работает как с ", так и с ', а также с их комбинацией |
Исправление: если там вообще нет кавычек, то есть типа class=lolka, то код не будет работать, так что вот пример для любого случая, то есть независимо от того, есть ли кавычки:
PHP код:
|
vadimiron
спасибо, что снова помогаешь )) проверила твой код - он удаляет не толко класс, но и от < до > )) такое можно намного короче написать )) мне нужно чтоб хтмл таги оставались не тронутыми |
странно, у меня всё получалось, тогда ещё подумаю
|
Ginger
Может ты удаляешь как то не так Вот мой пример, который работает у меня на компе: PHP код:
HTML код:
some text with image <p left='go'> goes here for testing purposes<br> |
vadimiron
вот так делаю. Код:
$searches = array("[\']","/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/"); <p class="lala">klmn oprst</p> остаётся: klmn oprst</p> |
:)
Так почему ты не так сделаешь, как я это делаю :) |
vadimiron
потому что я тут только часть в аррей указала, а там очень много других рег. выр. которые работают =) |
Цитата:
Надо либо поменять местами, либо лучше было бы дописать такой вид ковычек в ['\"], попробуй вот так: PHP код:
|
в 1 случае у меня получилось:
PHP код:
PHP код:
1) есть ли после p class="amega" закрыващий тэг или нет 2) строка заключена в ' или в " или в ` или без кавычек 3) есть ли перед и после = пробелы вне зависимости от их количества Это не будет работать, если перед закрывающим тэгом находятся пробелы. |
mrcnn
Одно только замечание, (.*) обознаечает, насколько я понимаю, бесконечное повторение любого элемента, предположим переменная $text содержит целую страницу HTML, где-то 5000 знаков, и первый class попадается только на 3000-чном знаке, тогда внутренняя переменная $1 функции preg_replace будет содержать все знаки до этого 3000-чного, что является не очень эффективным способом поиска, к этому надо ещё прибавить, что фугкции регулярок и без того притормаживают, так что я посоветовал бы искать напрямую class, и заменять его пустым знаком (то есть удалять) |
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); } |
mrcnn
на скол'ко я поняла этот код: '/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/' не учитывает того, что класс может быт' написан заглавными буквами? тепер если я хочу ещё и style искат'? тогда нужно так?: '/ (class|style)(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/' |
Ginger
Цитата:
'/ class(\s+)?=(\s+)?(\"|\'|\`)?(\w+)(\"|\'|\`)?/i' Цитата:
|
Вот полностью аррей с прегами. Рабочий вариант.
$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) |
Ginger, маленькая ремарочка. Слэши в приходящие данные будут вставляться в соответствии с установками в php.ini:
Цитата:
|
Prisoner
это я уже знаю. =)) тол'ко на сервере ини редактироват нет возможности =)) ALL =)) если желание ест' давайте усложним задачу? стили и класс нужно удалят' везде кроме тага <pre> я знаю, что нужно испол'зоват ^ , но не знаю как =)) |
Ginger, можно и через htaccess:
Цитата:
На счет усложнения можно так: Код:
$searches = array("[\']","'<h[4-5][^>]*?>'si","'</h[4-5]>'is","'<h[1-3][^>]*?>'si","'</h[1-3]>'si","'<hr[^>]*?>'si", '/(?<!pre) (class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si'); |
mozhet togda:
'/(?<!pre)?(\w+)(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si' ?? |
Кажется \w как раз не учитывает пробелы (это учет букв, цифр и подчеркивания). Сейчас проверить не могу, но думается, так:
'/(?<!pre)((\s+)(\w+)(\s+))?(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si' |
vadimiron
а есть какаенибудь мануалка офлайн вида у тебя, где описаны все операнды для регулярных выражений? очень был бы благодарен. |
Ginger, нет, некорректно работает :\. Не силен я в регулярках. Где же господа профи?
vadimiron, присоединяюсь к просьбе FADE. |
Ginger
а... тебе нужно редактировать php.ini ??? стукни мне в аску и я объясню как это сделать... |
Ginger
так... ты можешь привести пример того что дано и того что нужно получить??? |
мне на время дали почитать шикарную книгу по регулярным выражениям, могу засканировать....
|
Vlad Drakula о, давай отскань)
а я в свою очередь смогу через фанридер пропутить) ток скань больше или равно 300 диоптриям, иначе не переведет) vadimiron, а вообще у тебя есть шанс еще стаьтю написать типа модуля рерайт к апачу) мы ее прикрепим и подобное) |
|
не надо мне ИНИ редактироват'.
даже если и надо было бы, то я не раз ето делала Призонер просто для потомков об'ясняет. то что нужно сделат': удалят' style и class везде кроме тага <pre> все ж аррей сабмитится через форму и POST |
FADE, Prisoner Книга по регулярным выражениям: Jeffrey Friedl - Mastering Regular Expressions (англ. язык) http://linuxland.itam.nsc.ru/cgi-bin...essions.pdf.gz Есть перевод, вышедший в издательстве Питер. За переводом - в книжный магазин. |
mrcnn
1) ссылка битая, т.е. не битая, но скачать не дает... 2) у меня есть Jeffrey Friedl - Mastering Regular Expressions от издательства Питер причем второе издание... 3) но ничего я нашол эту книгу в EDK скоро скачаю... потом может где выложу... |
а на руском есть что у кого?)
|
E-mail
у меня есть эта книнига на русском, но только она бумажная... я завтра постараюсь не забыть посмотреть в своих отвалах разных док... может что найду... но честно говоря, учить английский надо, учить!!! |
На русском регулярные выражения очень хорошо описываются в книге "Learning Perl"(llama book, русское название - "Изучаем Perl"). Глава 7, http://webcraft.dem.ru/Perl1/g7.html
Описание регулярных выражений оттуда применимо и к php, потому что в нем поддерживаются PCRE (PERL compatible regualar expressions). Исключение составляют использование в коде, в Perl-е для регулярных выражений не требуется использование функции: Ср. --поиск Perl if ($text=~/foo/) ; PHP if (preg_match('/foo/',$text)) ; --замена Perl if ($string=~s/foo/bar/) ; PHP if (preg_replace('/foo/','/bar/', $text) ; |
Возник вопросик. Надеюсь на помощь гуру. Есть примерно следующий код на Perl:
Код:
#!/usr/bin/perl Код:
s/^(.+?:)/<strong>$1<\/strong>)/gm; Спасибо. |
по моей просьбе было предложено следующее:
$text = preg_replace("#<pre>(.*)\r\n(.*)</pre>#","<pre>\\1<br>\\2</pre>",$text); $text = preg_replace("'([\r\n])[\s]+'"," ",$text); $text = preg_replace("#<pre>(.*)<br>(.*)</pre>#","<pre>\\1\r\n\\2</pre>",$text); (мне правда не понятно зачем это...) но как vadimiron говорил так весь текст будет собиратся и хранится ж переменной. а тексты болшие.. есть идеи по улучшению? |
вот работающий код:
Код:
|
А вчём раздичие ereg и preg_match?
|
slaine
у них разная семантика... |
Помогите пожалуйста решить задачку с preg_replace :)
Имеем массив $pattern, с элементами примерно такого содержания: "'(?<!/)topic.php\?t=([0-9]*)'" и $replacement подобного вида: 'topic$1.html' Каким образом надо составить регулярное выражение в $pattern, чтобы преобразовывалось строго topic.php в topic.html, а не всё подряд, содержащее слово topic, например viewtopic. |
PHP код:
|
набор статей и утилит для работы с рег.выражениями http://www.smashingmagazine.com/2009...and-resources/
|
Есть строка:
Цитата:
т.е. в данном тексте убралось бы: Цитата:
|
Цитата:
Код:
{\<div\s+align\=\'center\'\>.+?\<\/div\>\s*(?:\<br \/\>\s*)*}is |
Sham, прикольно :)
спасибо, как бы это все самостоятельно разобрать... ) Просто гуру, с первого раза заработало все, как нужно... Возьмите в ученики :) |
Помогите еще чуток.
Заменить <p><a href="http://domen.com/node/40862?">читать дальше</a></p> на "..." (три точки) 40862 - это число может изменяться |
Код:
{\<p\>\s*\<a\s+href\=\"?http\:\/\/domen\.com\/node\/\d*\??\"?\>\s*читать\s+дальше\s*\<\/a\>\s*\<\/p\>}i |
Прошу помощи.
Как со странички Банка поместить в переменную продажу USD и EUR ? на PHP |
функцией preg_match или preg_match_all
|
Цитата:
Код:
$data = "<td>USD</td><td>7,9</td><td>8,1</td>"; Искомое: 8,1 обозначаю его \d\,\d Слева стоит: <td>USD</td><td>7,9</td><td>, где 7,9 тоже может быть динамическим, по этому обозначаю \d\,\d Справа стоит: </td> Выражение, которое описывает условие : Код:
$a = preg_match_all("/(?<=<td>USD<\/td><td>\d\,\d<\/td><td>)\d\,\d(?=<\/td>)/", $data, $matches); Код:
<td>USD</td><td>7,9</td><td>8,1</td> PHP код:
Код:
Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset 39 Это моя первая работа с регулярными выражениями, может я вообще не в ту степь говорю. Если можете обьяснить, то буду очень благодарен или попробуйте выложить свой вариант, я возможно там ошибку свою найду или хотя бы буду знать, как оно выглядит. Спасибо |
http://docs.php.net/manual/ru/regexp.reference.php
Цитата:
PHP код:
Если ищется только одно значение, то preg_match... |
Забавно так даже) получилась двухмерный массив. Результат в echo $matches[1][0];
|
Цитата:
|
Есть небольшой код:
Например: Код:
<p><div align="center"><img border="0" alt="" src="/uploads/news/banners/M-audio_Studiophile_BX5a_Deluxe-2.jpg" /> Код:
/uploads/news/banners/M-audio_Studiophile_BX5a_Deluxe-2.jpg Код:
http://site.com/uploads/news/banners/M-audio_Studiophile_BX5a_Deluxe-2.jpg PHP код:
:help: |
Цитата:
PHP код:
|
Разобрался в этом, большое спасибо.
А вот теперь мне нужно разобраться с preg_replace Вариант такой, и работает: $pattern = "{(src\=\")([^\"\s]*\/[^\/\"\s]+\")}"; $replacement = "$1http://djone.com.ua$2"; echo preg_replace($pattern, $replacement, $banner['cont']); Есть ли еще какой то, может более эстетический способ решения? |
PHP код:
2. одинарные кавычки лучше, ибо двойные парсятся PHP как строки. |
Помогите составить регулярное выражение
Есть строковая переменная, которая в себе содрежит в частности такой текст: Код:
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-66" id="menu-item-66"><a href="http://premises.kiev.ua/m/pro-kompaniyu/">Про компанію</a> <a href="http://premises.kiev.ua/m/pro-kompaniyu/">Про компанію</a> добавить class="drops" Я пытаюсь сделать это таким образом PHP код:
|
PHP код:
|
Время: 23:01. |
Время: 23:01.
© OSzone.net 2001-