Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите разобраться в рег. выражениях
 
 автор: Lelik   (28.07.2006 в 12:48)   письмо автору
 
 

Сел сегодня учить рег. выражения. Объясните пожалуйста как выводить всю строку, а не первое слово.

<?php
$txt 
"some text in this string";
if(
eregi("([a-z]*)"$txt$regs))
   {
      echo 
$regs[1]."<br>";
   }
else
  exit(
"Error!");
?>


я пробовал так - eregi("([a-z]*.[a-z]*)", но выводиится только второе слово, а как на больше слов задать рег выражение?

   
 
 автор: cheops   (28.07.2006 в 14:56)   письмо автору
 
   для: Lelik   (28.07.2006 в 12:48)
 

А вы что хотите сделать?

PS Лучше используйте Perl-регулярные выражения, POSIX-выражения будут вынесены из ядра в PHP 6.

   
 
 автор: Lelik   (28.07.2006 в 18:51)   письмо автору
 
   для: cheops   (28.07.2006 в 14:56)
 

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

   
 
 автор: cheops   (28.07.2006 в 22:27)   письмо автору
 
   для: Lelik   (28.07.2006 в 18:51)
 

Скрипт реализующий эту задачу может выглядеть следующим образом
<?php 
  $txt 
"some text in this string"
  if(
preg_match("|^.+$|"$txt$regs)) 
  { 
     echo 
$regs[0]."<br>"
  } 
?>


PS Чего-то не очень понятно, а почему бы просто не вывести строку?

   
 
 автор: Lelik   (29.07.2006 в 07:09)   письмо автору
 
   для: cheops   (28.07.2006 в 22:27)
 

>Скрипт реализующий эту задачу может выглядеть следующим
>образом

<?php 
  $txt 
"some text in this string"
  if(
preg_match("|^.+$|"$txt$regs)) 
  { 
     echo 
$regs[0]."&lt;br>"
  } 
?>


а можно объяснить принцип его работы

>PS Чего-то не очень понятно, а почему бы просто не вывести
>строку?

Я сначала хочу понять принцип работы, а потом меж тегов строки считывать

   
 
 автор: cheops   (29.07.2006 в 11:10)   письмо автору
 
   для: Lelik   (29.07.2006 в 07:09)
 

Данное регулярное выражение начинает поиск соответствия с начала строки ^ до конца $, при этом скрипту соответствует один или больше + любых символов . (вместе получается .+).

PS Регулярные выражения достаточно сложны, к ним следует относится как к самостоятельному языку программированию, на изучение которого нужно потратить время и усилия... по примерам без основ шансов разобраться практически нет. Лучше изучить их по книге Дж. Фридла "Регулярные выражения" (читать достаточно тяжело, но хотя бы до середины прочитать следует).

   
 
 автор: Lelik   (29.07.2006 в 19:19)   письмо автору
 
   для: cheops   (29.07.2006 в 11:10)
 

>...по
>примерам без основ шансов разобраться практически нет.
а те основы которые вы даете в книге РНР5(которая ваша самая первая, я по ней рег выражения учу) не хватит? просто я не все могу понять :(

   
 
 автор: cheops   (30.07.2006 в 11:32)   письмо автору
 
   для: Lelik   (29.07.2006 в 19:19)
 

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

   
 
 автор: Lelik   (30.07.2006 в 12:09)   письмо автору
 
   для: cheops   (30.07.2006 в 11:32)
 

Тогда для вынимания данных меж тегов видоизменить код до

<?php  
  $txt 
"some text in this string";  
  if(
preg_match("|^>.+$<\/|"$txt$regs))  
  {  
     echo 
$regs[0]."&lt;br>";  
  }  
?>


или


<?php  
  $txt 
"some text in this string";  
  if(
preg_match("|^<tag>.+<\/tag>$|"$txt$regs))  
  {  
     echo 
$regs[0]."&lt;br>";  
  }  
?>

   
 
 автор: cheops   (30.07.2006 в 12:32)   письмо автору
 
   для: Lelik   (30.07.2006 в 12:09)
 

У вас тэг один или их много в тексте?

   
 
 автор: Lelik   (30.07.2006 в 12:37)   письмо автору
 
   для: cheops   (30.07.2006 в 12:32)
 

для начала <tag> и </tag>, но может добавиться <?xml version="1.0" encoding="UTF-8" ?>

   
 
 автор: cheops   (30.07.2006 в 14:58)   письмо автору
 
   для: Lelik   (30.07.2006 в 12:37)
 

Если вы используете скрипт
<?php   
  $txt 
"<tag>some text in this string</tag>";   
  if(
preg_match("|^<tag>.+<\/tag>$|"$txt$regs))   
  {   
     echo 
$regs[0]."<br>";   
  }   
?>

Он найдёт соотвествие только для строки, который начинается с <tag> и заканчивается </tag>
<tag>some text in this string</tag>

Например, строка
<tag>some text in this string</tag> ещё чего-то

Не будет соответствовать регулярному выражению. Если убрать привязку к началу ^ и концу строки $, можно будет искать тэги в произвольном тексте
<?php   
  $txt 
"авда жыв авыа ыв <tag>some text in this string</tag> ваыва вы вы вы вы в";
  if(
preg_match("|<tag>.+<\/tag>|"$txt$regs))   
  {   
     echo 
$regs[0]."<br>";   
  }   
?>

Однако если в тексте будет несколько тэгов нужно будет использовать либо модификатор U либо конструкцию .+? для инвертирования жадности
<?php   
  $txt 
"авда жыв авыа ыв <tag>some text in this string</tag> ваыва <tag>вы</tag> вы вы вы в";
  if(
preg_match("|<tag>.+?<\/tag>|"$txt$regs))   
  {   
     echo 
$regs[0]."<br>";   
  }   
?>

   
 
 автор: Lelik   (30.07.2006 в 17:05)   письмо автору
 
   для: cheops   (30.07.2006 в 14:58)
 

>Однако если в тексте будет несколько тэгов нужно будет использовать либо модификатор
>U либо конструкцию .+? для инвертирования жадности

<?php    
  $txt 
"авда жыв авыа ыв <tag>some text in this string</tag> ваыва <tag>вы</tag> вы вы вы в"
  if(
preg_match("|<tag>.+?<\/tag>|"$txt$regs))    
  {    
     echo 
$regs[0]."<br>";    
  }    
?>

Да, но данный код выймет текст включая тэги, а можно без них?

   
 
 автор: cheops   (30.07.2006 в 22:42)   письмо автору
 
   для: Lelik   (30.07.2006 в 17:05)
 

Да, для этого следует заключить тот фрагмент, который вам требуется в круглые скобки и использовать в качестве индекса массива $regs номер круглых скобок
<?php     
  $txt 
"авда жыв авыа ыв <tag>some text in this string</tag> ваыва <tag>вы</tag> вы вы вы в";  
  if(
preg_match("|<tag>(.+?)<\/tag>|"$txt$regs))     
  {     
     echo 
$regs[1]."<br>";     
  }     
?>

   
 
 автор: Lelik   (01.08.2006 в 16:26)   письмо автору
 
   для: cheops   (30.07.2006 в 22:42)
 

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

   
 
 автор: cheops   (01.08.2006 в 22:18)   письмо автору
 
   для: Lelik   (01.08.2006 в 16:26)
 

Чего-то не очень понятно... если честно.

   
 
 автор: Lelik   (02.08.2006 в 02:39)   письмо автору
 
   для: cheops   (01.08.2006 в 22:18)
 

из файла, например такого :

<?xml version="1.0" encoding="windows-1251"?>
<rss xmlns:yandex="http://news.yandex.ru" version="2.0">
<channel>
<title>Яндекс.Новости: Киев - Главные новости</title>
<link>http://news.yandex.ru/Kiev/index.html</link>
<description>Первая в России служба автоматической обработки и систематизации новостей. Сообщения ведущих российских и мировых СМИ. Обновление в режиме реального времени 24 часа в сутки.</description>
<image>
<url>http://company.yandex.ru/i/50x23.gif</url><link>http://news.yandex.ru</link><title>Яндекс.Новости</title>
</image>
<lastBuildDate>Mon, 31 Jul 2006 10:07:57 +0400</lastBuildDate>
<item>
<title>Сколько зарабатывают киевляне?</title>
<link>http://news.yandex.ru/yandsearch?cl4url=www.investor.net.ua/ru/news/info%2D8482.html&amp;country=Russia</link>
<description>Среднемесячная заработная плата по Киеву за июнь 2006 года составляла 1784,64 грн., при этом, сравнительно с маем этого года она выросла на 8,4%. Такие данные обнародовал ... &lt;br&gt;Для сравнения среднемесячная заработная плата по Украине за июнь 2006 года составляет 1063,59 грн. и сравнительно с маем этого года выросла на 6%. А наименее ... &lt;br&gt;</description>
<pubDate>Thu, 27 Jul 2006 09:20:29 +0400</pubDate>
<guid>http://news.yandex.ru/yandsearch?cl4url=www.investor.net.ua/ru/news/info%2D8482.html&amp;country=Russia</guid>
</item>
</channel>
</rss>


Вывести одновременно содержимое всех блоков(текст между тегов итем) или указанное количество новостей.

   
 
 автор: cheops   (02.08.2006 в 10:33)   письмо автору
 
   для: Lelik   (02.08.2006 в 02:39)
 

Можно поступить следующим образом
<?php  
  $content 
file_get_contents("get.txt");
  
preg_match_all("|<item>[\s]*<title>([^<]+)</title>[\s]*<link>([^<]+)</link>[\s]*<description>([^<]+)</description>[\s]*<pubDate>([^<]+)</pubDate>[\s]*<guid>([^<]+)</guid>|isU"$content$out);
  echo 
"Число записей - ".count($out[1])."<br>";
  unset(
$out[0]);
  echo 
"<pre>";
  
print_r($out);
  echo 
"</pre>";
?>

PS Такие здоровые листинги лучше прикреплять в виде файла

   
 
 автор: Lelik   (05.08.2006 в 04:20)   письмо автору
 
   для: cheops   (02.08.2006 в 10:33)
 

Спасибо, и для закрепления - мне надо проверить вводимые данные, а точнее урл сайта, чтоб он был в виде www.site.domain, а также указать запрещенные символы(например слэши).

>PS Такие здоровые листинги лучше прикреплять в виде файла

Прошу прощенья. Следующий раз учту :)

   
 
 автор: cheops   (05.08.2006 в 10:50)   письмо автору
 
   для: Lelik   (05.08.2006 в 04:20)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования