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

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

Автор: Antyrat
Дата сообщения: 03.08.2007 15:10
Вот такая задача не могу никак справитса к примеру есть вот такое:

Код: <span style=\"width: 99%\"><a href=\"javascript:parent.JSChatSayTime(\'см.15:54:53\');\" target=\"tmp\"><font color=\"#8A8A8A\">15:54:53</font></a> <a target=\"tmp\" href=\"javascript:;\" onclick=\"parent.JSChatSayNick(\'цуц\')\"><b><font color=\"#CC0000\">цуц</font></b></a>: <font color=\"#004000\"><b><img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> <img src=\"/templates/govorun_com_ua/smile/44.gif\" border=\"0\"> см.15:54:14 см.15:54:39 </b></font></span>
Автор: vitovt
Дата сообщения: 23.08.2007 17:13
подскажите плз, не могу справиться регуляркой:
есть код:

Цитата:
<td colspan="7">
РАЙОН<br>
тут какой-то текс, неважно какой его может быть много<br />
<br>тел. 555885544</td>


и я вот написал так (задача стоит в том, чтобы в таких ячейках именно с colspan сделать все по центру и жирным)

$content_cleaned = preg_replace("{<td(.*)colspan=\"7\">(.*?)</td>}","<td colspan=\"8\" align=center><b>\${2}</b></td>",$content_cleaned);

но что-то не срабатывает (
Автор: Brodyaga
Дата сообщения: 23.08.2007 17:31
vitovt

Код:
$content_cleaned=' <td colspan="7">
РАЙОН<br>
тут какой-то текс, неважно какой его может быть много<br />
<br>тел. 555885544</td>';
$content_cleaned = preg_replace("{\<td(.*?)colspan\=\"7\">(.*?)\<\/td\>}is","<td colspan=\"8\" align=center><b>\${2}</b></td>",$content_cleaned);
echo $content_cleaned;

Автор: vitovt
Дата сообщения: 23.08.2007 18:10
Brodyaga
почему-то все такие ячейки в таблице идут сразу в самом начале (

Добавлено:
т.е поясню, когда изначально примерно такой


Цитата:


<tr>
<td colspan="7">
ГРАЙОН<br>

парпара прап <br />

<br>тел. 8-0152-74--52-37</td>
</tr>

<tr>
<td >
1.<br />
</td>

<td colspan="2">
СПК «Нива –2003»,<br />

д. Ратичи,<br />

<br>т5555<br />
</td>

<td >
животновод<br />

механизатор<br />
</td>

<td >
1<br />

1<br />
</td>

<td >
250<br />

250<br />

<br />
</td>

<td >

неблагоустроенные сельские дома<br />
</td>
</tr>

<tr>
<td colspan="7">
РАЙОН<br>
</td>
</tr>




а после применения это replace получаеться


Цитата:

<tr>
<td colspan="7" align=center><b>
РАЙОН<br>
про про про<br />

<br>тел. 4--52-37</b></td>
</tr>

<tr>
<td colspan="7" align=center><b>
РАЙОН<br>
рhghfgh
<br>тел. -58-52</b></td>
</tr>

<tr>
<td colspan="7" align=center><b>
РАЙОН<br>
пропро <br />

<br>52</b></td>

</tr>
Автор: RayZ
Дата сообщения: 18.11.2007 22:00
Братцы, помогите немного.
надо разбить перечень значений строки (часть строки SQL запроса), к примеру:

"1, '2' , 'пример', '', NULL, '1,2,3', 'a, bc', 2221, 12, '12\'.., \'3123'"

Проблема в том, что просто делать split(',',...) нельзя, так как в значении могут попадаться запятые... Дошел примерно до сего:
preg_match_all(((\')?([a-z0-9\\\/А-Яа-я,\. \-]+|(\'\'))(\')?)(, )? ... )
Это не совсем чистое решение, мне кажется в некоторых случаях оно будет лажать
Автор: paulvasykov
Дата сообщения: 29.12.2007 20:00
while (preg_match('@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',$formHTML))
{ $this->deleteparsed=1; //Удалять распарсенные таблицы
$formHTML= preg_replace_callback('@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',
array(&$this, "filltags"),$formHTML);}

filltags - Процедура сохранения науденных тэгов в массив.

Использую следующий regex, выдерания таблиц, без вложенных таблиц.
мне необходимо отсортировать данные таблиц, по порядку, как они идут в html.
Можно использовать позицию найденной <table...>, но как это делаеться в regex?
Либо можно сначала брать таблицы с максимальной вложенностью таблиц, и разбирать их рекурсивно. Но морока с деревом тогда. и я не смогу придумать regex для выбора таких таблиц. сложнее...
Автор: Delphi6
Дата сообщения: 29.12.2007 22:43
paulvasykov

Цитата:
мне необходимо отсортировать данные таблиц, по порядку, как они идут в html

А почему не хотите воспользоваться прямо preg_match_all? Она вернет все варианты и как раз в той последовательности в которой они вам нужны.

Ну и конечно если речь пойдет о вложенных таблицах то однозначно посоветую искать рекурсивно. Также если вам хочется через preg_match вы может вручную указывать с какой позиции искать (позиция последнего найденного объекта вам возвращается вместе с результатом) PREG_OFFSET_CAPTURE

п.с. Если вы делает прасинг учтите что часто бывает когда таблицы просто не закрываются или не имеют парных <td> и <tr>.
Автор: paulvasykov
Дата сообщения: 30.12.2007 23:49
Спасибо Delphi6!. PREG_OFFSET_CAPTURE То что нужно.

Начал парсить html, и теперь выкидывает (Пишет DNS error, вообще глюк PHP???
) на preg_match. Наверно какоенибудь переполнение regex?

<?
$html = implode('',file("zz.txt"));
preg_match(
    '@(<table([^>]*>))((?>.(?!<table([^>]*>)))*?)(</table([^>]*>))@is',
    $html,$rs,PREG_OFFSET_CAPTURE);

?>
zz.txt тут http://www.moddi.ru/zz.2007.12.31.@.00.49.rar

Первый раз глюк такой фижу, как бороться?.

P.S. С Новым 2008 Годом.
Автор: Delphi6
Дата сообщения: 31.12.2007 00:35
paulvasykov
С наступающим желаю по меньше багов в скриптах

Цитата:
Пишет DNS error, вообще глюк PHP???

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

Еще очень удобно вместо конструкции $html = implode('',file("zz.txt")); воспользоваться прямо file_get_content она эквивалентна file за тем исключением что возвращает не массив прямо одну строку (плюс сохранены оригинальные переносы строк, а они могут быть как и \n так и \r\n)

p.s. Код работает на моем локально ПК + на локальном апаче
Автор: paulvasykov
Дата сообщения: 31.12.2007 01:42
у мя appach 1.33 + php 4.4.4.
в php 5.xx работает , действительно. нет, в 5м перестает работать appach, после выполнения данного скрипта.
поставил 16 метров памяти, в настройках appacha.

В скрипте используеться file(url), URL без www (http://forum.ru-board.com)....
может из за этого? но 2 первых странички грузяться.....

на 4м php если оставить строчек 50 из zz.txt, то прокатывает, тоесть regex получаеться?

Залил на хостинг, тама все работает.
Не смог настроить у себя локально.
Автор: CoolKonig
Дата сообщения: 31.12.2007 14:46
Помогите плиз составить такое регулярное выражение(проверка) заголовка комментария
- должен начинаться только с букв
- может содержать буквы, цифры, пробелы, кавычки, вопросительный и восклицательный знак, тире и двоеточие.
Спасибо
Автор: dimon308
Дата сообщения: 31.12.2007 17:49
народ ищите программу RegexBuddy и с помощью нее делайте регулярные выражения!
там хороший мануал, и куча примеров!
Автор: Delphi6
Дата сообщения: 01.01.2008 02:22
paulvasykov

Цитата:
В скрипте используеться file(url), URL без www (http://forum.ru-board.com)....
может из за этого? но 2 первых странички грузяться.....

Очень вероятно что проблема именно в памяти, у меня например стоит 128мб, и не раз было что даже при таком раскладе ложился весь PHP, просто при получении странички она занимает немного больше места чем положено, и возможно у вас где-то утечка данных, можете привести весь пример скрипта где все ложиться? Я на локальном ПК понижу лимит и проверю

Добавлено:
CoolKonig

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

Это больше похоже на "напишите вместо меня" Сделайте наброски а мы уже подправим, просто если мы вас накормим это хорошо а вот если научим ловить рыбу то это супер
Автор: CoolKonig
Дата сообщения: 01.01.2008 17:18

Цитата:
Это больше похоже на "напишите вместо меня" [Image] Сделайте наброски а мы уже подправим, просто если мы вас накормим это хорошо а вот если научим ловить рыбу то это супер

Это понятно Вот что сделал:

Код: preg_match("/^[0-9a-zA-Za-яА-Я]+[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $text)
Автор: Delphi6
Дата сообщения: 01.01.2008 17:37
CoolKonig
А у вас нет возможности перегнать назад -> проверить -> перегнать назад?

Но как вариант можно попробовать сделать вот так:

Код: <?php
$test1 = "&quot; some example text is here";
$test2 = "&amp;some example text is here";
$test3 = "&amp ;some example text is here";
var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test1));
var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test2));
var_dump(preg_match("/^(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я]{1})[0-9a-zA-Za-яА-Я!?)\-\.\,\040]*$/", $test3));
?>
Автор: CoolKonig
Дата сообщения: 01.01.2008 18:20

Цитата:
А у вас нет возможности перегнать назад -> проверить -> перегнать назад?

Можно, но мне кажется так лучше зачем лишние действия совершать =)


Код: !preg_match("/^(?:&quot;|[0-9a-zA-Za-яА-Я]){1}(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?()\-\.\,\040])+$/", $text)
Автор: evle
Дата сообщения: 01.01.2008 18:25
Delphi6

Цитата:
У вас стоял + что значит 1 или 0 совпадений, это вам не подходит, так как если строка начнется с ! то она тоже подойдет, так как в таком случае + воспримется как 0 совпадений а вот уже "второй" символ у вас может быть любым, включая !. Вам надо юзать однозначно {1} что значит один символ.

Ужас какой. Что новый год с людьми делает…
CoolKonig
По заявленным условиям получается как-то так:
/^[a-zA-Za-яА-Я](?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/
Автор: CoolKonig
Дата сообщения: 01.01.2008 18:34

Цитата:
Ужас какой. Что новый год с людьми делает…
CoolKonig
По заявленным условиям получается как-то так:
/^[a-zA-Za-яА-Я](?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/

Немного изменил требования=) Текст может начинаться и с кавычек.
Автор: evle
Дата сообщения: 01.01.2008 18:41
CoolKonig
Я про то, что {1} и «+ что значит 1 или 0 совпадений» — это какая-то чушь несусветная.
Если с кавычками в начале, то
/^(?:&quot;|[a-zA-Za-яА-Я])(?:&quot;|&amp;|[0-9a-zA-Za-яА-Я!?—)(:\-\.\,\040])*$/
Хотя логичнее всё-таки делать проверку до htmlspecialchars.
Автор: Delphi6
Дата сообщения: 01.01.2008 18:54
evle

Цитата:
Ужас какой. Что новый год с людьми делает…

Мда, наговорил я точно Просто после празднования + и ? перепутал Я еще хорошо держусь, при учете что еще не спал и сейчас готовлюсь идти праздновать еще к одним знакомым

п.с. как это я вообще умудряюсь все успевать
Автор: paulvasykov
Дата сообщения: 02.01.2008 18:49
Delphi6
можете привести весь пример скрипта где все ложиться?

http://www.crxprivate.com/?pagem=tips&pagein=crxgrabber

Используються шаблоны (template.tmpl.php). Вот именно на этом шаблоне скрипт валиться.

Попробовал ставить 128 метров, на php4, тоже самое.
На php5 умирает толи php, толи аппач, после запуска этого скрипта.
и web сервер не работает. Приходиться перезагружать appatch весь.
Автор: Delphi6
Дата сообщения: 06.01.2008 03:47
paulvasykov
Сори за позний ответ, были проблемы со своими скриптами Я запустил 1.php и он выдал результат. Какой из файлом мне надо открыть что бы увидеть баг? grab.php grabber.php или 1.php (этот работает).
Автор: 6epcepk
Дата сообщения: 06.01.2008 18:52
В строке может содержаться переносы на новую строку (парсится текстовый файл).
Необходимо удалить все между ключевыми словами (begin и end, к примеру):
Данный код не удаляет символы между ключевыми словами, так как есть перенос на другую строку:

Код: $c= '111beginDROP TABLE IF EXISTS "gallery_albums";CREATE TABLE "gallery_albums"
)end222';

echo preg_replace('#begin(.*)end#', '', $c);
Автор: Brodyaga
Дата сообщения: 06.01.2008 20:14
6epcepk
Попробуй использовать модификатор s:

Цитата:
<?php
$c= '111beginDROP TABLE IF EXISTS "gallery_albums";CREATE TABLE "gallery_albums"
)end222';

echo preg_replace('#begin(.*)end#s', '', $c);
?>

Автор: 6epcepk
Дата сообщения: 07.01.2008 16:03
Brodyaga
Спасибо, все получилось (:
Автор: 6epcepk
Дата сообщения: 07.01.2008 22:27
Вот что-то опять не получается сделать маску удаления, совсем я плох в регулярных выражениях (:

Код: $s = "(50, 47, '', 'modules/news/news/js/delete.js', 'bogus', '720', '480', 3, 0),
(51, 47, '', 'modules/news/news/js/card.js', 'bogus', '720', '480', 3, 0),";

echo preg_replace("#\([0-9a-z], [0-9a-z], '', '(.*)', '[0-9a-z]', '[0-9a-z]', '[0-9a-z]', [0-9a-z], [0-9a-z]\),\n#", '', $s);
Автор: Andrej_k
Дата сообщения: 12.01.2008 07:34
Помогите, не могу сооброзить,

if ($bodytext == "") {$content = "$hometext";} else {$content = "$bodytext";} #
// ну или empty($bodytext)

Все прекрасно работает, до тех пор, пока в $bodytext не встречаются пробелы....

можно конечно в $bodytext предварительно убрать пробелы, но принципиально, может есть другое, более изящное решение?



Добавлено:
наверное без вариантов,
$bodytext = trim($bodytext);
Автор: Brodyaga
Дата сообщения: 12.01.2008 10:28
6epcepk

Код:
<?php
$s = "(50, 47, '', 'modules/news/news/js/delete.js', 'bogus', '720', '480', 3, 0),
(51, 47, '', 'modules/news/news/js/card.js', 'bogus', '720', '480', 3, 0),";

echo preg_replace("#\(([0-9a-z]+),(\s*)([0-9a-z]+),(\s*)'',(\s*)'(.*?)',(\s*)'([0-9a-z]*)',(\s*)'([0-9a-z]*)',(\s*)'([0-9a-z]*)',(\s*)([0-9a-z]+),(\s*)([0-9a-z]+)\),(\s*)#", '', $s);
?>
Автор: folter
Дата сообщения: 17.01.2008 17:00

Код: preg_replace ("~[^tex]~", "", "ishodnaya tex stroka tex"); // удаляет из строки все символы кроме "t", "e" и "x"
Автор: VXC
Дата сообщения: 18.01.2008 09:43
ихвиняюсь если не свосем по адрессу.
Суть такова:
Есть поле <textarea> куда забивается текст комментария/новости
Нужно чтобы скрипт автоматически определял новую строку и вставлял <br>.Ну чтобы все в одну строку не мешалось.Подскажите в какую сторону копать

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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