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

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

Автор: Cheery
Дата сообщения: 09.10.2013 08:25
drondo

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

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

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


а если вам нужно удалить только первый пробел, то ltrim($match[1])
удобнее же когда просто делается? это не сказывается на быстродействии

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

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

нет там никакой магии..
регулярка работает последовательно - выбирает пробелы пока не попадается то, что к ним не относится.. а к ним относятся цифры, которые уже в той части, что выбирается скобками.
поэтому первые пробелы не попадают в группу, а остальные попадают.
Автор: Vitaly2106
Дата сообщения: 17.11.2013 00:34
Здравствуйте, есть такой 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);
?>
Автор: Cheery
Дата сообщения: 18.11.2013 20:25
Vitaly2106
ну, к примеру, так.. не говорю, что лучший вариант, но просто и понятно

Код: echo preg_replace_callback("'<a([^<>]*?)>.*</a>'Usi", 'myfun', $text);

function myfun($args)
{
if (stripos($args[0], 'site1') !== false)
return $args[0];
}
Автор: Vitaly2106
Дата сообщения: 18.11.2013 23:33
Cheery
Спасибо, извините за тупость, в программировании плохо разбираюсь...

Тоесть этот код нужно поместить перед участком где заносятся данные в базу?

Кстати, ещё пробовал такой вариант добавить перед этим

Код: mysql_query("UPDATE `table` SET `link` = '".$newlink."' WHERE `link` = '".$row['link']."';");
Автор: Cheery
Дата сообщения: 18.11.2013 23:45
Vitaly2106

Цитата:
Тоесть этот код нужно поместить перед участком где заносятся данные в базу?

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


Цитата:
$newlink=preg_replace("'<[\/\!]*a[^<>]*?>'si", '', $row['link']);  


ну, то есть
$newlink = preg_replace_callback("'<a([^<>]*?)>.*</a>'Usi", 'myfun', $row['link']);

и код функции myfun
Автор: Vitaly2106
Дата сообщения: 19.11.2013 00:44
Спасибо, насколько я понял, оно должно выглядеть так: ?

Код: <?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_callback("'<a([^<>]*?)>.*</a>'Usi", 'myfun', $row['link']);
mysql_query("UPDATE `table` SET `link` = '".$newlink."' WHERE `link` = '".$row['link']."';");
}
function myfun($args)
{
if (stripos($args[0], 'site1') !== false)
return $args[0];
}
mysql_close($db);
?>
Автор: Cheery
Дата сообщения: 19.11.2013 01:09
Vitaly2106
preg_replace_callback("'<a([^<>]*?)>(.*)</a>'Usi",
и

Код: function myfun($args)
{
if (stripos($args[0], 'site1') === false)
return $args[2];
else
return $args[0];
}
Автор: Vitaly2106
Дата сообщения: 19.11.2013 07:40
Cheery
Спасибо, попробовал, скрипт всё равно удаляет все ссылки кроме указанного, а не наоборот (удалить только указанную ссылку)... Можно ещё что-то сделать?
Автор: Cheery
Дата сообщения: 19.11.2013 08:04
Vitaly2106
ну включите голову то )

Цитата:
 if (stripos($args[0], 'site1') !== false)

Автор: koreets2011
Дата сообщения: 30.12.2013 11:38
День добрый и с наступающим Вас!
Помогите составить регулярное выражение.
Имеется строка вот такого вида:

Код:
"id":"1398003215789","id_city":"70000001","id_org":"79098069","lon":"85.021045","lat":"56.4788133333333","alt":"0","velocity":"0","timestamp":"2013-12-30 16:05:59","status":0+
"id":"1422001602862","id_city":"70000001","id_org":"79098087","lon":"85.1702683333333","lat":"56.4931316666667","alt":"0","velocity":"0","timestamp":"2013-12-30 16:06:23","status":0+
"id":"1137010539723","id_city":"70000001","id_org":"79098069","lon":"84.9636675666667","lat":"56.5201652833333","alt":"0","velocity":"17","timestamp":"2013-12-30 16:06:38","status":0
Автор: Cheery
Дата сообщения: 30.12.2013 19:58
koreets2011

Код: $t = '{"CARS":[{"id":"1137007760468","id_city":"70000001","id_org":"79098069","lon":"84.9732188333333","lat":"56.525168","alt":"95","velocity":"0","timestamp":"2013-12-28 02:35:36","status":0}]}';
$ar = json_decode($t, true);
foreach($ar['CARS'] as &$car)
{
if ($car['id_org'] != '79098069')
$car = null;
}
$ar = array_filter($ar['CARS']);
var_dump($ar);
Автор: koreets2011
Дата сообщения: 30.12.2013 20:14
Спасибо Cheery то что нужно. С Новым годом!!!
Автор: maxus5578
Дата сообщения: 31.01.2014 22:15
Хочу вырезать информацию из ссылок, дивов и тд через preg_match_all
Информация с другого сайта. Пробовал вырезать только один маленький кусочек и все работало,но когда пробую вырезать все сразу то нечего.
Я плохо знаю всю эту штуку, и кроме как экранировать кавычки больше нечего не знаю
var_dump показывает вот что

Код:
array(10) {
[0]=>
array(0) {
}
[1]=>
array(0) {
}
[2]=>
array(0) {
}
......
.....
....
}
Автор: Cheery
Дата сообщения: 31.01.2014 22:20
maxus5578

Цитата:
$result

о содержимом мы сами догадаемся?
какой смысл в регулярке, если не видно с чем работа идет?
Автор: maxus5578
Дата сообщения: 01.02.2014 00:19
Cheery
это результат парсинга curl $result = curl_exec($curl);
там вся страница сайта
Автор: Cheery
Дата сообщения: 01.02.2014 00:28
maxus5578

Цитата:
это результат парсинга curl

ну и почему нам от этого должно легче стать ?)
не видя к чему применяется регулярка, нельзя сказать в чем возникает проблема.
Автор: maxus5578
Дата сообщения: 01.02.2014 01:06
вот весь код, разбирайтесь сами =)
[more=Читать дальше..]

Код:
function search_torrent($query){

$query = urlencode(iconv('windows-1251','UTF-8', $query));

$cl2 = curl_init();
curl_setopt($cl2, CURLOPT_URL, 'http://site.ru/search/'.$query.'');
curl_setopt($cl2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl2, CURLOPT_HEADER, 0);
curl_setopt($cl2, CURLOPT_POST, 1);
curl_setopt($cl2, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6');
curl_setopt($cl2, CURLOPT_CONNECTTIMEOUT, 60); // таймаут соединения
curl_setopt($cl2, CURLOPT_TIMEOUT, 60); // таймаут ответа
curl_setopt($cl2, CURLOPT_REFERER, 'http://site.ru/'); // Подделываем значение - откуда пришли данные.
curl_setopt($cl2, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа
$result = curl_redir_exec($cl2);
curl_close($cl2);

$result = UTF8toCP1251( $result );

$find2 = "";

$p1=strpos($result,"<table width=\"100%\"><tr class=\"backgr\">");
$p2=strpos($result,"</table><b>Страницы");
$result = substr($result,$p1,$p2-$p1);



preg_match_all('#<a href="(.*)"><img src="http://s.site.ru/i/m.png" alt="M"></a><a href="/file/(.[0-9]*)/(.*)">(.*)</a>(.*)<td align="right">([0-9]*..?[0-9]+.?)&nbsp;(.[A-Z]*)</td><td align="center"><span class="green"><img src="http://s.site.ru/t/arrowup.gif" alt="S" />&nbsp;(.[0-9]*)</span>&nbsp;<img src="http://s.site.ru/t/arrowdown.gif" alt="L" /><span class="red">&nbsp;(.[0-9]*)</span>#Uis', $result, $find);

// print_r($find);

$count = intval(count($find['1']));
$i = 0;
$find2 = "";
while ($i<$count-1) {
$i++;


$find2 .= <<<HTML
<tr valign="top">
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;">{$i}</td>
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;"><a target="_blank" href="http://site.ru/file/{$find['3'][$i]}">{$find['4'][$i]}</a></td>
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;"><a target="_blank" href="http://site.ru/file/{$find['1'][$i]}">Скачать</a></td>
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;">{$find['6'][$i]}&nbsp;{$find['7'][$i]}</td>
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;">{$find['8'][$i]}</td>
<td style="border-bottom: 1px solid #eeeeee; border-left: 1px solid #eeeeee;">{$find['9'][$i]}</td>
</tr>
HTML;

}

// $find2 = $result;

if( !$find2 or $find2=="" ){
$finds = "Ничего не найдено. Попробуйте повторить поиск.";
} else {
$finds = <<<HTML
<div class="formlist"><table width="100%" cellspacing="0" cellpadding="10" class="tabletorrents"><tr valign="top">
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;">№</td>
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;">Название</td>
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;"></td>
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;">Размер</td>
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;">ID 1</td>
<td style="background: #f5f5f5; font-size: 8pt; font-family: Verdana; color: #999999;">UID 2</td>
</tr>{$find2}
</table></div><br>
HTML;
}

return ($finds);

}
Автор: Cheery
Дата сообщения: 01.02.2014 01:20
maxus5578
да елки палки.. вы думаете хоть немного?
зачем нам ваш код - к какому тексту вы применяете регулярное выражение?
Автор: maxus5578
Дата сообщения: 01.02.2014 01:28
Cheery
обычный html с другого сайта
Автор: Cheery
Дата сообщения: 01.02.2014 01:30
maxus5578

Цитата:
обычный html с другого сайта

ну и возитесь с ним самостоятельно. я больше повторять не буду, раз с первого раза (вернее уже четвертого, по моему) не понимаете.
Автор: maxus5578
Дата сообщения: 01.02.2014 01:32
Cheery
да я и вожусь, вы можете сказать я хоть правильно делаю, или вообще нужно по другому?
Автор: Cheery
Дата сообщения: 01.02.2014 01:35
maxus5578

Цитата:
вы можете сказать я хоть правильно делаю

без содержимого переменной $result - нет
Автор: maxus5578
Дата сообщения: 01.02.2014 01:57
$result это просто страница, я проверял через var_dump и echo и выводит страницу с того сайта.
Я пробовал вытащить просто ссылки со страницы
preg_match_all('#<a href="(.*)"><img src="http://s.site.ru/i/m.png" alt="M"></a>#Uis', $result, $find);
и все работало, но когда я хочу вырезать не только ссылку, он нечего не находит.
Экранировать точно не нужно?
И последний вопрос. Можно ли использовать пример 5 вызовов preg_match_all, и получится ли быть массивом $find[1] $find[2] $find[3] и тд, т.к у меня не хочет искать по другому.
Автор: Cheery
Дата сообщения: 01.02.2014 01:59
maxus5578

Цитата:
но когда я хочу вырезать не только ссылку, он нечего не находит

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


Цитата:
Экранировать точно не нужно

я не знаю, что вы имеете в виду под "экранированием".


Цитата:
пример 5 вызовов preg_match_all

можно
Автор: ALeXkRU
Дата сообщения: 01.02.2014 03:27
maxus5578

Cheery тонко намекает (5 раз!!), что нужно привести адрес той самой "просто страницы", т.е. хотя бы конкретный текст "обычного html", из которого рег.выражение должно вырезать информацию..
Без этой информации трудно судить, в чём может быть ошибка и почему не работает..
Автор: maxus5578
Дата сообщения: 01.02.2014 11:44
вот текст страницы
[more]

Код:
<tr class="gai"><td>09&nbsp;Окт&nbsp;13</td><td><a href="magnet:?xt=urn:btih:317c16baff67283a9988135ad5ce7b191bc257d5><img src="http://s.site.ru/i/m.png" alt="M"></a>
<a href="/file/309254/7-dnej_les-7-jours-du-talion-2010-bdrip-720p-ot-exkinoray-l1">7 дней / Les 7 jours du talion (2010) BDRip 720p от ExKinoRay</a></td> <td align="right">2<img src="http://s.site.ru/i/com.gif" alt="C"></td>
<td align="right">5.72&nbsp;GB</td><td align="center"><span class="green"><img src="http://s.site.ru/t/arrowup.gif" alt="S">&nbsp;3</span>&nbsp;<img src="http://s.site.ru/t/arrowdown.gif" alt="L"><span class="red">&nbsp;0</span></td></tr>
Автор: Cheery
Дата сообщения: 01.02.2014 21:52
maxus5578
все лишние куски нужно убрать, так как любой лишний пробел или перенос строки сразу приведет к тому, что регулярка перестанет работать.
к примеру - в регулярке указано
<img src="http://s.site.ru/t/arrowup.gif" alt="S" />&nbsp;
а в тексте
<img src="http://s.site.ru/t/arrowup.gif" alt="S">&nbsp;

например так

Код: preg_match_all('#<a href="(magnet:.*)">.*<a href="/file/(.[0-9]*)/(.*)">(.*)</a>(.*)<td align="right">([0-9]*..?[0-9]+.?)&nbsp;(.[A-Z]*)</td>'.
'<td align="center"><span class="green"><img src="http://s.site.ru/t/arrowup.gif"[^>]*>&nbsp;(.[0-9]*)</span>.*'.
'<span class="red">&nbsp;(.[0-9]*)</span>#Uis', $result, $find);
Автор: maxus5578
Дата сообщения: 02.02.2014 15:43
Cheery
не работает =(
var_dump показал пустые массивы

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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