Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Rendom



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Учебники регулярных выражений
 
Кто сможет составить выражение для такого случая:

Код:
 
<table border=0>
<tr>
   <td>blablablabla<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table></td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Нужно удалить из этого всего кусок "<table border=0><tr><td>blablabla_UNIQTEXT_blablabla</td></tr></table>". Иными словами нужно вырезать текст от "<table" до "</table>" внутри которого есть строка "UNIQTEXT", но при этом не удалить лишнего. В результате должно получиться:

Код:
 
<table border=0>
<tr>
   <td>blablablabla</td>
   <td><table border=1><tr><td>blablabla</td></tr></table>666666</td>
</tr
</table>
 

Всего записей: 115 | Зарегистр. 27-10-2002 | Отправлено: 23:26 17-05-2005 | Исправлено: AZJIO, 04:05 09-12-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
khakas

Цитата:
Вы подразумеваете, что print $1 по факту напечатает $matches[1][11], верно я понял мысль? Т.е. самое ПОСЛЕДНЕЕ совпадение, для которого произошел мач (а он происходит на любой подстроке для *, в отличие от +)  

нет, если используете preg_match, то вернет только первое значение (пустое)
если preg_match_all, то все
 

Цитата:
Тогда мне не совсем понятно - после "1990" ведь нет больше символов, откуда берется $mathes[.][11], что сравнивается с шаблоном в 12-й раз ??? Что ДО цифр вернулось 10 пустых мест - это понятно...  


Код:
echo ord($matches[1][11]);

покажет вам 0  
 
практически во всех языках программирования строка записывается как
какой то текст\0
 
где \0 определяет конец строки.
 
правда, думаю, такое выдаст и для любого "".. но насчет \0 в конце каждой строки это точно.
http://php.net/manual/en/function.rtrim.php
к примеру

Цитата:
"\0" (ASCII 0 (0x00)), the NUL-byte.

http://php.net/manual/en/security.filesystem.nullbytes.php
 
 

Цитата:
И - как же жадность?... я ее понимаю так - из всех возможных совпадений с шаблоном берется самое длинное...

жадность работает тогда, когда выборка попадает под регулярное выражение.  
"ничего" означает один символ не попадающий под выражение (цифра)
если же сделать \w*, то тут жадность работает, так как символы попадают в выборку.
 
ps: насчет нуля могу и ошибаться - не помню всех деталей.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:43 01-07-2013 | Исправлено: Cheery, 23:55 01-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А нет, насчет нуля я ошибся.. PHP хранит строку как массив, то есть с указанием длины и нули могут быть где угодно, а могут и не быть

Цитата:
The string in PHP is implemented as an array of bytes and an integer indicating the length of the buffer. It has no information about how those bytes translate to characters, leaving that task to the programmer. There are no limitations on the values the string can be composed of; in particular, bytes with value 0 (“NUL bytes”) are allowed anywhere in the string (however, a few functions, said in this manual not to be “binary safe”, may hand off the strings to libraries that ignore data after a NUL byte.)

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

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 09:35 02-07-2013
khakas

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
м-да...
Вообще, все "родилось" из вопроса №7 вот тут:
http://company.yandex.ru/job/vacancies/trainee_perl.xml
Я тупо загнал код в интерпретатор и получил ответ - пустая строка.
Меня попросили прокомментировать мои ответы - и на этот вопрос я честно признался, что не понимаю, почему так))
На самом деле, мне с самого начала ПОКАЗАЛОСЬ, что объяснить могу - что как раз из-за варианта "ИЛИ ни фига подобного" для *. Но - жадность же....
 
А погадать-то не проблема: типа, наверно, берется первый символ строки и сравнивается с шаблоном - не подходит, но срабатывает вариант "ИЛИ ни фига подобного". Поскольку мач произошел, то обработка прекращается и возвращается то, что совпало, т.е. пустая строка.
А может, сравнение начинается не с первого символа (раз жадность) - а с конца строки? и на такие оговорки вроде натыкался - что при жадности строка парсится с конца.
 
В общем, пока не увижу кода компилятора регекспов - не поверю, что понял))
(Устал от шаманских будней....)

Всего записей: 4 | Зарегистр. 15-05-2007 | Отправлено: 23:29 02-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
khakas
там речь о Perl, тут - PHP
есть некоторые отличия.
Perl - Регулярные выражения / Regexpы

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:45 02-07-2013
khakas

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сорри, не заметил, что тут пхп - гугль привел сюда...)
наверно, потому что в перловой ветке бедновато

Всего записей: 4 | Зарегистр. 15-05-2007 | Отправлено: 12:36 03-07-2013 | Исправлено: khakas, 12:38 03-07-2013
zondex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте. Мне нужно произвести замену url'ов в тегах <a> в текста, при этом конец ссылки должен совпадать с неким шаблоном.  
 Например имеем html-текст:  
   
 
Код:  

Код:
<div align="center">  
   <a href="http://www.site.com/01/img.jpg" target=_blank>  
   <a href="http://www.site.com/01/img2.jpg" target=_blank>  
 </div>  

 
 
   
   
 и имеем шаблон  
 $nameq = ''img2.jpg;  
 По этому шаблону я пытаюсь заменить содержимое второй ссылки следующим регулярным выражением:  
 
Код:
Код:
$new_content = preg_replace("/<a href=\".+".$nameq."([^\"]*)\".*>/siU", "<a href=\"$url\">", $content);  

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

Всего записей: 22 | Зарегистр. 20-04-2010 | Отправлено: 03:24 31-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zondex
например так

Код:
$content =<<< T
<div align="center">  
   <a href="http://www.site.com/01/img.jpg" target=_blank>  
   <a href="http://www.site.com/01/img2.jpg" target=_blank>  
</div>  
T;
$nameq = 'img2.jpg';
$url = 'test.html';
echo preg_replace('/<a href=(\'|")[^\'"]*' . preg_quote($nameq) . '[^\'"]*\\1.*>/siU', '<a href="' . $url . '">', $content);  


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 03:50 31-07-2013 | Исправлено: Cheery, 03:51 31-07-2013
zondex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Большое Вам спасибо, все идеально работает.

Всего записей: 22 | Зарегистр. 20-04-2010 | Отправлено: 04:49 31-07-2013
zondex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Подскажите пожалуйста, столкнулся с такой проблемой
 

Код:
    preg_match_all('/<a href=(\'|")([^\'"]*' . preg_quote($fo[$i]) . '[^\'"]*)\\1.*>/siU', $db_row['post_content'], $urls);

 
Регулярное выражение не срабатывает если в тексте ссылки присутствует символ одинарной ковычки '
 
Пример текста:

Код:
<a href="http://site.com/blabla/Don't.zip" target=_blank>

Всего записей: 22 | Зарегистр. 20-04-2010 | Отправлено: 23:53 01-08-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zondex

Цитата:
Регулярное выражение не срабатывает если в тексте ссылки присутствует символ одинарной ковычки '  

он там не должен присутствовать по правилам ссылок.
 
но сейчас исправлю.
 
 
ps: вот так проще.. там не нужны двойные слэши

Код:
'/<a href=(\'|")((?!\1).)*' . preg_quote($nameq). '((?!\1).)*\1.*>/siU'


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:58 01-08-2013 | Исправлено: Cheery, 00:17 02-08-2013
zondex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Ещё раз благодарю за помощь!

Всего записей: 22 | Зарегистр. 20-04-2010 | Отправлено: 01:47 02-08-2013
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите пожалуйста составить регулярку для поиска.  
текст типа
Код:
любое слово: 123 456 789.00 RUR;

нужно вычленить цифровую часть и отдельно код валюты.
формат цены - число разбитое по три цифры через пробел, в конце точка и две цифры копеек.
например  
1 234.05
12 235.02
123 456.02
и т.п.
если целая часть нулевая то два варианта - или 0.01 или просто .01
вместо RUR может быть USD, EUR, NOK и т.п., код валюты всегда с заглавных букв, после точка с запятой.
пытался с помощью вики составить для цифр
Код:
\:\s ([\d][\s\d,\.,\d]{0,})[A-Z]{0,};
но видно что то не понял, не работает
 

Всего записей: 464 | Зарегистр. 28-10-2005 | Отправлено: 19:25 08-10-2013 | Исправлено: drondo, 19:26 08-10-2013
L0T

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drondo
Может быть так?

Код:
/
(\d{0,3})
[[:space:]]?
(\d{0,3})
[[:space:]]?
(\d{0,3})
\.
(\d{2})
[[:space:]]
([A-Z]{3})
;
/x

НО это разбиение по разрядам, т.е строку любое слово: 111 222 333.02 RUR; он разобъет примерно так:
111
222
333
02
RUR

 
Если же надо просто вычленить цену и валюту, то достаточно будет сделать так:

Код:
/
([\d\.[:space:]]{3,14})
[[:space:]]
([A-Z]{3})
;
/x

В этом случае будет где-то так:
111 222 333.02
RUR

 
Только цену не забыть потом обернуть в функцию удаления ведущих пробелов на всякий случай.
 
 
P.S. Предполагается, что корректность ввода цены (и разбиения по разрядам) производится где-то в другом месте (например, при вводе данных), и в регулярку поступают уже корректные данные.

Всего записей: 280 | Зарегистр. 06-01-2009 | Отправлено: 22:46 08-10-2013 | Исправлено: L0T, 22:55 08-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drondo

Код:
  $test = 'любое слово: 123 456 789.00 RUR;';
  preg_match('/([\d\s\.]+)\s+([A-Z]{3})/', $test, $match);
  var_dump($match);

 

Цитата:
array(3) {
  [0]=>
  string(19) " 123 456 789.00 RUR"
  [1]=>
  string(15) " 123 456 789.00"
  [2]=>
  string(3) "RUR"
}
 

потом просто str_replace(' ', '', $match[1])

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:54 08-10-2013
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
L0T
и особенно
Cheery
Огромное спасибо за помощь.  
Правда в решении Cheery захватывается первый пробел, он потом удаляется, но это не выход. Я сам виноват, не написал что в итоге не нужно удалять все пробелы, нужно получить число, отформатированное так же как и было.
В итоге с помощью вики, ваших ответов и методом научного тыка на сайте http://regex101.com родилась регулярка

Код:
([\.]*[\d][\s\d]{0,}[\.]*[\d]+)\s([A-Z]{3})

Это не реклама, сайт не мой, но если кому то поможет в решении то можно вынести в шапку, отлично разбирает регулярки.
Вот например по моей http://regex101.com/r/cB2tA8

Всего записей: 464 | Зарегистр. 28-10-2005 | Отправлено: 09:15 09-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drondo

Цитата:
Я сам виноват, не написал что в итоге не нужно удалять все пробелы, нужно получить число, отформатированное так же как и было.  

я же написал - сделайте потом удаление пробелов и все.

Цитата:
str_replace(' ', '', $match[1])

 
а если вам нужно удалить только первый пробел, то ltrim($match[1])
удобнее же когда просто делается? это не сказывается на быстродействии
 
ну или вот так будет без первого пробела(ов)
/\s+([\d\s\.]+)\s+([A-Z]{3})/

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 09:25 09-10-2013 | Исправлено: Cheery, 09:32 09-10-2013
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Согалсен Ltrim() удобнее но про него еще нужно знать и вспомнить Я с ПХП и RegExp знаком 2-й день. Появилась проблема и ПХП был выбран из-за как говорят легкого порога вхождения, и это действительно так, гугл, SO, php.su и php.net дали ответ почти на все вопросы. Из регулярок знал только *.* и подобные маски в поиске windows.  
Вопрос немного не по теме, где прочитать про магию \s+([\d\s\.]+)\s+([A-Z]{3}) ?  
Сам не догадался до такой конструкции, без \s+ вначале собирает с пробелами а с ним без, хотя в дальнейшей конструкции [\d\s\.] присутствует пробел но он не попадает а как бы прилипает к первым пробелам. Есть какой нибудьть не просто справочник по регуляркам а по вот таким не очевидным (для меня как для новичка) моментам? Желательно на русском

Всего записей: 464 | Зарегистр. 28-10-2005 | Отправлено: 10:38 09-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drondo

Цитата:
 где прочитать про магию \s+([\d\s\.]+)\s+([A-Z]{3})  

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


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 10:57 09-10-2013
Vitaly2106

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, есть такой php код который удаляет все html ссылки из определённой таблицы:

Код:
 
<?php  
$db = mysql_connect('host', 'user', 'password');  
mysql_select_db('database');  
$query = "SELECT * FROM `table` WHERE `link` LIKE '%\<a %'";  
$res = mysql_query($query);  
while($row = mysql_fetch_array($res)){  
    $newlink=preg_replace("'<[\/\!]*a[^<>]*?>'si", '', $row['link']);  
    mysql_query("UPDATE `table` SET `link` = '".$newlink."' WHERE `link` = '".$row['link']."';");  
}  
mysql_close($db);  
?>
 

 
Подскажите, как сделать чтоб данный код удалял ссылки только определённого домена, а на все?
 
P.S. В соседней теме подсказали что можно использовать preg_replace_callback и в нем проверять адрес, может кто пожалуйста привести пример как в данном случае можно реализовать? А то в программировании плохо разбираюсь...

Всего записей: 23 | Зарегистр. 14-08-2012 | Отправлено: 02:34 17-11-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitaly2106
ну, к примеру, так.. не говорю, что лучший вариант, но просто и понятно

Код:
 echo preg_replace_callback("'<a([^<>]*?)>.*</a>'Usi", 'myfun', $text);
 
 function myfun($args)
 {
     if (stripos($args[0], 'site1') !== false)
        return $args[0];
 }


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:25 18-11-2013 | Исправлено: Cheery, 22:26 18-11-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru