Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   регулярные выражения (http://forum.oszone.net/showthread.php?t=42824)

Ginger 21-12-2004 17:51 282130

регулярные выражения
 
Помогите, пожалуйста, составить рег. выражение:
Вот пример кода, который не работает:
Код:

$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 282176

PHP код:

preg_match("/user_img\/(\d{12})/",$text,$result); 

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

Ginger 19-01-2005 17:56 290109

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 290925

Код:

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

vadimiron 22-01-2005 14:13 291042

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

PHP код:

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

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

Ginger 25-01-2005 14:51 291953

vadimiron
спасибо, что снова помогаешь ))

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

vadimiron 25-01-2005 20:31 292049

странно, у меня всё получалось, тогда ещё подумаю

vadimiron 25-01-2005 23:46 292113

Ginger
Может ты удаляешь как то не так
Вот мой пример, который работает у меня на компе:
PHP код:

$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

Вывод:
HTML код:

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 292684

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 292687

:)
Так почему ты не так сделаешь, как я это делаю
:)

Ginger 27-01-2005 16:38 292688

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

vadimiron 27-01-2005 23:49 292804

Цитата:

вот так делаю.
Код:
$searches = array("[\']","/\sclass=((['\"]\w{0,50}['\"])|(\w{0,50}))/");
$replaces = array("`", "");
$text = preg_replace($searches,$replaces,$text);
Так в этом случае сначало меняются кавычки, а уже потом идёт поиск по паттерну, я же не учитывал ещё и такой вид ковычек, как `
Надо либо поменять местами, либо лучше было бы дописать такой вид ковычек в ['\"], попробуй вот так:

PHP код:

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


mrcnn 28-01-2005 08:43 292910

в 1 случае у меня получилось:
PHP код:

$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 случае:
PHP код:

$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 293027

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

mrcnn 28-01-2005 13:47 293036

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 294415

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

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


mrcnn 02-02-2005 04:14 294539

Ginger
Цитата:

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

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

Цитата:

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

Ginger 02-02-2005 19:39 294754

Вот полностью аррей с прегами. Рабочий вариант.

$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 294862

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 295272

Prisoner
это я уже знаю. =))
тол'ко на сервере ини редактироват нет возможности =))


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

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

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

Prisoner 05-02-2005 03:41 295437

Ginger, можно и через htaccess:
Цитата:

Директивы php_value и php_admin_value используются для определения значения переменной.
Форма записи:
php_value имя_переменной значение
php_admin_value имя_переменной значение
Директиву php_admin_value можно использовать только в конфигурационных файлах Apache, а php_value - и в файлах .htaccess
Пример:
php_value include_path "/home/user-www/includes"

На счет усложнения можно так:
Код:

$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');
$replaces = array("`" ,"<h4>" ,"</h4>" ,"<h3>" ,"</h3>" ,"<hr size=\"1\">","");

Естественно, нужно предусмотреть ситуацию когда между pre и class|style есть любые допустимые символы, а не один пробел (сделано, чтобы не загромождать паттерн)

Ginger 07-02-2005 16:11 296107

mozhet togda:

'/(?<!pre)?(\w+)(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si'

??

Prisoner 08-02-2005 14:22 296374

Кажется \w как раз не учитывает пробелы (это учет букв, цифр и подчеркивания). Сейчас проверить не могу, но думается, так:
'/(?<!pre)((\s+)(\w+)(\s+))?(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si'

FADE 08-02-2005 22:27 296542

vadimiron
а есть какаенибудь мануалка офлайн вида у тебя,
где описаны все операнды для регулярных выражений?

очень был бы благодарен.

Prisoner 09-02-2005 08:06 296629

Ginger, нет, некорректно работает :\. Не силен я в регулярках. Где же господа профи?
vadimiron, присоединяюсь к просьбе FADE.

Vlad Drakula 09-02-2005 22:24 296868

Ginger
а... тебе нужно редактировать php.ini ???
стукни мне в аску и я объясню как это сделать...

Vlad Drakula 09-02-2005 22:29 296870

Ginger
так... ты можешь привести пример того что дано и того что нужно получить???

Vlad Drakula 09-02-2005 22:31 296872

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

FADE 09-02-2005 23:06 296887

Vlad Drakula о, давай отскань)
а я в свою очередь смогу через фанридер пропутить) ток скань больше или равно 300 диоптриям, иначе не переведет)

vadimiron, а вообще у тебя есть шанс еще стаьтю написать типа модуля рерайт к апачу) мы ее прикрепим и подобное)

vadimiron 10-02-2005 01:55 296919

Сори, что не отвечаю, у меня сейчас экзамены, но 19 всё кончится и я буду свободен, тогда смогу написать статью и про реврайт, и про регулярки
а пока могу пару сайтов подбросить, может кому пригодиться:
первый
второй третий

Ginger 10-02-2005 19:21 297143

не надо мне ИНИ редактироват'.
даже если и надо было бы, то я не раз ето делала

Призонер просто для потомков об'ясняет.

то что нужно сделат':

удалят' style и class везде кроме тага <pre>
все ж аррей
сабмитится через форму и POST

mrcnn 12-02-2005 03:37 297584


FADE, Prisoner
Книга по регулярным выражениям:

Jeffrey Friedl - Mastering Regular Expressions (англ. язык)

http://linuxland.itam.nsc.ru/cgi-bin...essions.pdf.gz

Есть перевод, вышедший в издательстве Питер. За переводом - в книжный магазин.

Vlad Drakula 12-02-2005 11:26 297615

mrcnn
1) ссылка битая, т.е. не битая, но скачать не дает...
2) у меня есть Jeffrey Friedl - Mastering Regular Expressions от издательства Питер причем второе издание...
3) но ничего я нашол эту книгу в EDK скоро скачаю... потом может где выложу...

E-mail 12-02-2005 23:39 297748

а на руском есть что у кого?)

Vlad Drakula 12-02-2005 23:58 297753

E-mail
у меня есть эта книнига на русском, но только она бумажная...
я завтра постараюсь не забыть посмотреть в своих отвалах разных док... может что найду...

но честно говоря, учить английский надо, учить!!!

mrcnn 13-02-2005 12:25 297867

На русском регулярные выражения очень хорошо описываются в книге "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)
;

Oaxa 14-02-2005 17:47 298277

Возник вопросик. Надеюсь на помощь гуру. Есть примерно следующий код на Perl:
Код:

#!/usr/bin/perl
use strict;
use locale;
use CGI qw(-no_xhtml -nosticky :standard);
...
my $result = "Some user multiline input:...";
$result =~ s/^(.+?:)/strong($1)/gmeo;
...

Вопрос, собственно, в безопасности подобной конструкции. Не сможет ли пользователь выполнить команду операционной системы, или совершить другие подобные деструктивные действия, введя определенные данные (что-нибудь типа system('...'))? Если да, то как этого избежать? Понимаю, что
Код:

s/^(.+?:)/<strong>$1<\/strong>)/gm;
избавляет меня от сомнений, но такой вариант меня не вполне устраивает.
Спасибо.

Ginger 21-02-2005 16:55 300485

по моей просьбе было предложено следующее:

$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 говорил так весь текст будет собиратся и хранится ж переменной.
а тексты болшие..
есть идеи по улучшению?

Ginger 07-04-2005 22:40 313818

вот работающий код:
Код:


      $pres = array(); $i = 0;
      $text = preg_replace('{(<pre[^>]*?>.*</pre>)}Uesi','"UnrealPRE$i".(($pres[$i++]="$1")?"":"")', $text);
     
      $text = preg_replace("'([\r\n])[\s]+'"," ",$text);
      $done = false;
      while (!$done)
      {  $ch1 = strlen($text);
          $text = str_replace("  "," ",$text);
          $ch2 = strlen($text);
          if ($ch1==$ch2) {$done=true;} else {$done=false;}
      }

      $text = preg_replace('/UnrealPRE(\d+)/e', '$pres[$1]', $text);

единственный его баг (который выявлен на даный момент) - он вырезает слова содеержащие знак $ и сам знак отдельно.

slaine 16-05-2005 17:19 324648

А вчём раздичие ereg и preg_match?

Vlad Drakula 16-05-2005 22:12 324727

slaine
у них разная семантика...

Siava one 16-06-2009 17:30 1144867

Помогите пожалуйста решить задачку с preg_replace :)
Имеем массив $pattern, с элементами примерно такого содержания:

"'(?<!/)topic.php\?t=([0-9]*)'"

и $replacement подобного вида:

'topic$1.html'

Каким образом надо составить регулярное выражение в $pattern, чтобы преобразовывалось строго topic.php в topic.html, а не всё подряд, содержащее слово topic, например viewtopic.

Sham 17-06-2009 15:55 1145154

PHP код:

$text preg_replace
(
    
'{\btopic\.php\?t\=([0-9]*)}i',
    
'topic${1}.html',
    
$text
); 


LaoTsi 25-06-2009 23:10 1151861

набор статей и утилит для работы с рег.выражениями http://www.smashingmagazine.com/2009...and-resources/

Artem-Samsung 10-07-2009 20:10 1164183

Есть строка:

Цитата:

джерело: SS<br /><br />Між прем&quot;єрами у Лондоні та Нью-Йорку Том Фелтон встиг побувати у Канаді. І не просто проїздом, а дуже активно займався там рекламою шостого фільму про Гаррі Поттера. Він побував на кількох телешоу, і зараз ми маємо змогу подивитися відео. <br /><br /><div align='center'><a href="http://gallery.ru/watch?ph=yw1-byMau" target="_blank"><img src="http://data9.gallery.ru/albums/gallery/93673-ca012-20642300-400.jpg" border="0" class="linked-image" /></a> <a href="http://gallery.ru/watch?ph=yw1-byL6T" target="_blank"><img src="http://data9.gallery.ru/albums/gallery/93673-ed090-20642077-400.jpg" border="0" class="linked-image" /></a><br /></div><br />По-перше, це відео з передачі <b>Much on Demand</b>, на якій Том розповів про роль Драко у &quot;Напівкровному Принці&quot;та &quot;Смертельних реліквіях&quot;, а також про свої акторські плани та проекти, які його цікавлять. Дивимося: <a href="http://www.youtube.com/watch?v=mdAKv1TJ8qU&amp;feature=player_embedded" target="_blank">частина 1</a>, <a href="http://www.youtube.com/watch?v=lNGAdWGVRoA&amp;feature=player_embedded" target="_blank">частина 2</a>.<br /><br />Ще одне відео з Торонто, в якому Фелтон обговорює трансформацію свого персонажа, дивимося <a href="http://www.youtube.com/watch?v=b0foEfzQXfE&amp;feature=player_embedded" target="_blank">тут</a>.<br /><br />Ну і нарешті відео з канадсього MTV можна побачити <a href="http://www.youtube.com/watch?v=G0_nHEm9MEw&amp;feature=player_embedded" target="_blank">тут</a>.<br /><br />А більше фото з канадського турне Фелтона шукайте в <a href="http://sajuka.gallery.ru/watch?a=yw1-bX05" target="_blank">альбомі</a>.
Нужно преобразовать в переменную, что бы из нее удалилось <div class='center'>любой текст</div> и все последующие за этим <br />
т.е. в данном тексте убралось бы:


Цитата:

<div align='center'><a href="http://gallery.ru/watch?ph=yw1-byMau" target="_blank"><img src="http://data9.gallery.ru/albums/gallery/93673-ca012-20642300-400.jpg" border="0" class="linked-image" /></a> <a href="http://gallery.ru/watch?ph=yw1-byL6T" target="_blank"><img src="http://data9.gallery.ru/albums/gallery/93673-ed090-20642077-400.jpg" border="0" class="linked-image" /></a><br /></div><br />

Sham 10-07-2009 20:20 1164196

Цитата:

Цитата Artem-Samsung
Нужно преобразовать в переменную, что бы из нее удалилось <div class='center'>любой текст</div> и все последующие за этим <br /> »

preg_replace с регуляркой типа
Код:

{\<div\s+align\=\'center\'\>.+?\<\/div\>\s*(?:\<br \/\>\s*)*}is

Artem-Samsung 11-07-2009 01:54 1164406

Sham, прикольно :)
спасибо, как бы это все самостоятельно разобрать... )

Просто гуру, с первого раза заработало все, как нужно...
Возьмите в ученики :)

Artem-Samsung 19-09-2009 02:17 1222259

Помогите еще чуток.
Заменить
<p><a href="http://domen.com/node/40862?">читать дальше</a></p>
на "..." (три точки)

40862 - это число может изменяться

Sham 19-09-2009 02:34 1222260

Код:

{\<p\>\s*\<a\s+href\=\"?http\:\/\/domen\.com\/node\/\d*\??\"?\>\s*читать\s+дальше\s*\<\/a\>\s*\<\/p\>}i

Artem-Samsung 13-10-2009 00:13 1241390

Прошу помощи.
Как со странички Банка поместить в переменную продажу USD и EUR ? на PHP

Sham 13-10-2009 01:10 1241432

функцией preg_match или preg_match_all

Artem-Samsung 26-11-2009 20:36 1280710

Цитата:

Цитата Sham
функцией 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);
На выходе (echo $a) получается:

Код:

<td>USD</td><td>7,9</td><td>8,1</td>
совсем не 8,1

PHP код:

$data "<td>USD</td><td>7,9</td><td>8,1</td>";
$a preg_match_all("/(?<=<td>USD<\/td><td>\d\,\d<\/td><td>)\d\,\d(?=<\/td>)/"$data$matches);
echo 
$data

Отметить стоит еще то, что в процессе вылазили ошибки типа:

Код:

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset 39
когда пытался цифры описать так: \d*\d*. Как сделать что бы с * - работало?, а то даже на {1,3} матерится.

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

Спасибо

Sham 26-11-2009 21:18 1280734

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

Цитата мануал
Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих. Например, (?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo". Сами утверждения 'назад' ограничены так, чтобы все подстроки, которым они соответствуют, имели фиксированную длину. Но, в случае, если используются несколько альтернатив, они не обязаны иметь одинаковую длину. Таким образом шаблон (?<=bullock|donkey) корректен, но (?<!dogs?|cats?) вызовет ошибку во время компиляции.

т.е. квантификаторы повторения не прокатят ибо длина будет произвольная, и вообще вы зашли в дебри, откуда дорога только на дурку...

PHP код:

preg_match
(
    
'{\<td[^\>]*\>\s*USD\s*\<\/td\>\s*\<td[^\>]*\>\s*[\d\,]+\s*\<\/td\>\s*\<td[^\>]*\>\s*([\d\,]+)\s*\<\/td\>}i',
    
$data,
    
$matches
);

// понатыкал \s (возможных пробелов) и [^\>]* вероятных атрибутов у таблицы
// это делается, чтобы меньше регулярку исправлять в будущем...

echo $matches[1]; //тут искомое должно быть 

UPD
Если ищется только одно значение, то preg_match...

Artem-Samsung 26-11-2009 22:17 1280787

Забавно так даже) получилась двухмерный массив. Результат в echo $matches[1][0];

Sham 26-11-2009 22:24 1280792

Цитата:

Цитата Artem-Samsung
получилась двухмерный массив »

это если preg_match_all (она все совпадения ищет), а если preg_match, то одномерный.

Artem-Samsung 08-07-2010 15:08 1449700

Есть небольшой код:
Например:
Код:

<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 код:

preg_match ('{src=\"([.]+)\"}'$string$match); 

Возвращается пустой результат. Help
:help:

Sham 08-07-2010 21:01 1449892

Цитата:

Цитата Artem-Samsung
preg_match ('{src=\"([.]+)\"}', $string, $match); »

если нужно вытащить путь, то можно попробовать так
PHP код:

preg_match ('{src\=\"([^\"\s]*\/)?[^\/\"\s]+\"}'$string$match);
echo 
$match[1]; 

шаблон получился общий, поэтому для лучшей "зацепки" лучше добавить возможные расширения файлов в src

Artem-Samsung 08-07-2010 22:22 1449938

Разобрался в этом, большое спасибо.
А вот теперь мне нужно разобраться с preg_replace

Вариант такой, и работает:

$pattern = "{(src\=\")([^\"\s]*\/[^\/\"\s]+\")}";
$replacement = "$1http://djone.com.ua$2";
echo preg_replace($pattern, $replacement, $banner['cont']);

Есть ли еще какой то, может более эстетический способ решения?

Sham 08-07-2010 23:16 1449974

PHP код:

echo preg_replace
(
    
'{(?<=src\=\")([^\"\s]*\/[^\/\"\s]+\.(?:png|jpe?g|bmp|gif))(?=\")}i',
    
'http://djone.com.ua${1}',
    
$banner['cont']
); 

1. уточняющие расширения картинок для ускорения, и src есть не только у img
2. одинарные кавычки лучше, ибо двойные парсятся PHP как строки.

Artem-Samsung 21-03-2012 00:39 1883654

Помогите составить регулярное выражение

Есть строковая переменная, которая в себе содрежит в частности такой текст:

Код:

<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>
<ul class="sub-menu">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-72" id="menu-item-72"><a href="http://premises.kiev.ua/m/pro-kompaniyu/proekty/">Проекти</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-71" id="menu-item-71"><a href="http://premises.kiev.ua/m/pro-kompaniyu/kolektyv/">Колектив</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-73" id="menu-item-73"><a href="http://premises.kiev.ua/m/pro-kompaniyu/chomu-z-namy-vyhidno/">Чому з нами вигідно</a></li>
</ul>
</li>

Мне нужно в гиперссылку
<a href="http://premises.kiev.ua/m/pro-kompaniyu/">Про компанію</a>

добавить class="drops"

Я пытаюсь сделать это таким образом

PHP код:

$pattern "/(<li\sclass=\"menu-item\s[a-zA-Z0-9\-\s]*\" \sid=\"[a-zA-Z0-9\-\s]*\"><a\s)/i";
$menu preg_replace($pattern"${1} class='drops'"$menu); 

но никак не получается

Sham 21-03-2012 01:11 1883665

PHP код:

$pattern '~\<li\s+class\=\"menu\-item[^\"]+\"\s+id\=\"[^\"]+\"\>\s*\<a\s~i';
//или $pattern = '~\<li\s+class\=\"menu\-item[^\>]+\>\s*\<a\s~i';
$menu preg_replace($pattern'${0} class="drops"'$menu); 

т.е. лучше инверсные наборы символов, иначе возможны неучтенные (не учтен _ там)


Время: 23:01.

Время: 23:01.
© OSzone.net 2001-