Ru-Board.club
← Вернуться в раздел «Web-программирование»

» PHP: Регулярные выражения (RegExp, Regular, eregi, preg)

Автор: Cheery
Дата сообщения: 04.06.2013 00:22
n0byk
да что вы к той регулярке привязались то??

Код: $strings = array(
'http://www.youtube.com/watch?v=0g9poWKKpbU',
'http://www.youtu.be/0g9poWKKpbU',
'http://www.youtube.com/watch?v=0g9poWKKpbU&list=SPJuzssrVaWjbIpmb36XabFUkiowJQQ9DH',
'http://www.youtube.com/watch?feature=player_embedded&v=0g9poWKKpbU'
);

foreach($strings as $string) {
preg_match("/((\/|v=)(\w{10,12}))/Ui" , $string, $result);
var_dump($result);
}
Автор: n0byk
Дата сообщения: 04.06.2013 10:40
Cheery
Спасибо, однако!
Автор: Cheery
Дата сообщения: 04.06.2013 17:36
n0byk
возможно лучше [\w-] вместо \w - не знаю, какие символы бывают в этом id
Автор: n0byk
Дата сообщения: 06.06.2013 17:43
Cheery
Странно, обрезает последний символ.
поменял {10,12} на {11,13}
Кажется работает
Автор: mishakor
Дата сообщения: 26.06.2013 05:45
Есть кусок когда который, при переписке добавлял а затем менял бы в начале темы сообщения "Re[1]: тема сообщения"

есть такой кусочек кода

Код: [no]
$reSubject = nc_preg_replace('/^Re[d+].*)$/','Re['.(nc_substr($f_Subject,3)+1).']:$1',$f_Subject);
if ($f_Subject == $reSubject) $reSubject = preg_replace('/^Re.*)$/','Re[2]:$1',$f_Subject);
if ($f_Subject == $reSubject) $reSubject = "Re: $f_Subject";
[/no]
Автор: Cheery
Дата сообщения: 26.06.2013 06:10

Код: $str = 'Re[2]:Test';
echo preg_replace_callback('/^(Re\[(\d+)\]:|())/', function($re) {
return 'Re[' . (++$re[2]). ']:';
}, $str);
Автор: mishakor
Дата сообщения: 26.06.2013 06:45
Спасибо за помощь, пример работает прекрасно
Автор: Kaylang
Дата сообщения: 27.06.2013 15:17
Всем привет!

Кто-нить может накидать регулярное выражение для выделения почтового индекса (5 идущих подряд цифр) из строк типа: "Castello 3839 - 30122 - Venezia - Italia".
Цифры могут быть любыми, но именно 5 штук. В некоторых строках индекса может не быть. Т.е. желательно еще и проверку наличия.
ЗЫ. если не влом, сразу на php.

Заранее благодарен!
Автор: Cheery
Дата сообщения: 27.06.2013 19:44
Kaylang
\d{5}

но это выцепит любые 5 идущих подряд цифр
Автор: Kaylang
Дата сообщения: 27.06.2013 21:34
Cheery

Цитата:
\d{5}

Не выцепляет, потому и написал сюда.


Код:
$my_string = 'Castello 3839 - 30122 - Venezia - Italia';
preg_match('\d{5}',$my_string, $matches)
var_dump($matches);
Автор: Cheery
Дата сообщения: 27.06.2013 22:01
Kaylang
ну так кто будет правильно записывать регулярку?

Код: $my_string = 'Castello 3839 - 30122 - Venezia - Italia';
preg_match('/\d{5}/',$my_string, $matches);
var_dump($matches);
Автор: Kaylang
Дата сообщения: 27.06.2013 22:02
Усе, отбой. Разобрался.

Добавлено:
Cheery

Цитата:
preg_match('/\d{5}/',$my_string, $matches);

тока я вместо слешей % поставил.

В любом случае, благодарю!
Автор: khakas
Дата сообщения: 01.07.2013 15:41
Есть педагоги тут?
может кто-нибудь толково объяснить, почему для строки типа "blablabla 1990" регексп /([0-9]*)/ ничего не вернет в $1???

Ясно-понятно, что сам мач происходит - хоть [0-9] перед * воткни, хоть что. Ясно-понятно, что /(.*)([0-9]*)/ даст нам счастье. Легко проверить, что /([0-9]+)/ даст нам ожидаемые 1990. Но почему тогда *, который логически от + отличается только вариантом "или нифига подобного" отдает нам пустую строку?

Уверен - многие на моем месте придумали бы себе объяснение (вопрос-то с виду элементарный) и успокоились, а чувака с таким вопросом заклевали бы. Но я реально хочу понять работу регекспов - шаманов в отрасли и без меня навалом...
Автор: Cheery
Дата сообщения: 01.07.2013 19:43
khakas

Цитата:
"или нифига подобного" отдает нам пустую строку?

потому что под "нифига подобного" попадает все, что идет до цифр..
при использовании preg_match_all - поймете, если посмотрите результат.


Код: $str = 'blablabla 1990';
preg_match_all('/(\d*)/', $str, $matches);
var_dump($matches);
Автор: khakas
Дата сообщения: 01.07.2013 22:29
хмм...
Вы подразумеваете, что print $1 по факту напечатает $matches[1][11], верно я понял мысль? Т.е. самое ПОСЛЕДНЕЕ совпадение, для которого произошел мач (а он происходит на любой подстроке для *, в отличие от +)
Тогда мне не совсем понятно - после "1990" ведь нет больше символов, откуда берется $mathes[.][11], что сравнивается с шаблоном в 12-й раз ??? Что ДО цифр вернулось 10 пустых мест - это понятно...

И - как же жадность?... я ее понимаю так - из всех возможных совпадений с шаблоном берется самое длинное...
Автор: Cheery
Дата сообщения: 01.07.2013 22:43
khakas

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

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


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


Код: echo ord($matches[1][11]);
Автор: Cheery
Дата сообщения: 02.07.2013 08:35
А нет, насчет нуля я ошибся.. 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.)

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

А погадать-то не проблема: типа, наверно, берется первый символ строки и сравнивается с шаблоном - не подходит, но срабатывает вариант "ИЛИ ни фига подобного". Поскольку мач произошел, то обработка прекращается и возвращается то, что совпало, т.е. пустая строка.
А может, сравнение начинается не с первого символа (раз жадность) - а с конца строки? и на такие оговорки вроде натыкался - что при жадности строка парсится с конца.

В общем, пока не увижу кода компилятора регекспов - не поверю, что понял))
(Устал от шаманских будней....)
Автор: Cheery
Дата сообщения: 02.07.2013 22:45
khakas
там речь о Perl, тут - PHP
есть некоторые отличия.
Perl - Регулярные выражения / Regexpы
Автор: khakas
Дата сообщения: 03.07.2013 11:36
сорри, не заметил, что тут пхп - гугль привел сюда...)
наверно, потому что в перловой ветке бедновато
Автор: zondex
Дата сообщения: 31.07.2013 02:24
Здраствуйте. Мне нужно произвести замену 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>
Автор: Cheery
Дата сообщения: 31.07.2013 02:50
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);
Автор: zondex
Дата сообщения: 31.07.2013 03:49
Cheery
Большое Вам спасибо, все идеально работает.
Автор: zondex
Дата сообщения: 01.08.2013 22:53
Cheery
Подскажите пожалуйста, столкнулся с такой проблемой


Код: preg_match_all('/<a href=(\'|")([^\'"]*' . preg_quote($fo[$i]) . '[^\'"]*)\\1.*>/siU', $db_row['post_content'], $urls);
Автор: Cheery
Дата сообщения: 01.08.2013 22:58
zondex

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

он там не должен присутствовать по правилам ссылок.

но сейчас исправлю.


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

Код: '/<a href=(\'|")((?!\1).)*' . preg_quote($nameq). '((?!\1).)*\1.*>/siU'
Автор: zondex
Дата сообщения: 02.08.2013 00:47
Cheery
Ещё раз благодарю за помощь!
Автор: drondo
Дата сообщения: 08.10.2013 18:25
помогите пожалуйста составить регулярку для поиска.
текст типа
Код: любое слово: 123 456 789.00 RUR;
Автор: L0T
Дата сообщения: 08.10.2013 21:46
drondo
Может быть так?

Код: /
(\d{0,3})
[[:space:]]?
(\d{0,3})
[[:space:]]?
(\d{0,3})
\.
(\d{2})
[[:space:]]
([A-Z]{3})
;
/x
Автор: Cheery
Дата сообщения: 08.10.2013 21:54
drondo

Код: $test = 'любое слово: 123 456 789.00 RUR;';
preg_match('/([\d\s\.]+)\s+([A-Z]{3})/', $test, $match);
var_dump($match);
Автор: drondo
Дата сообщения: 09.10.2013 08:15
L0T
и особенно
Cheery
Огромное спасибо за помощь.
Правда в решении Cheery захватывается первый пробел, он потом удаляется, но это не выход. Я сам виноват, не написал что в итоге не нужно удалять все пробелы, нужно получить число, отформатированное так же как и было.
В итоге с помощью вики, ваших ответов и методом научного тыка на сайте http://regex101.com родилась регулярка

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

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Xitami Web Server + PHP+ zend optimizer


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.