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

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

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

 

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

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

тема: Три задачи
 
 автор: Shorr Kan   (27.12.2005 в 01:10)   письмо автору
 
 

Есть $cod . В нем много кода, в том числе:

1. <a href='что-то' ...
2. <img src='что-то'...
3. <a href='что-то.../order.php....что-то'....

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

   
 
 автор: cheops   (27.12.2005 в 13:02)   письмо автору
 
   для: Shorr Kan   (27.12.2005 в 01:10)
 

А можно реальный кусочек текста увидеть?

   
 
 автор: Shorr Kan   (27.12.2005 в 14:01)   письмо автору
 
   для: cheops   (27.12.2005 в 13:02)
 

Я вам письмом послал.

   
 
 автор: elenaki   (27.12.2005 в 14:29)   письмо автору
 
   для: Shorr Kan   (27.12.2005 в 14:01)
 

ответьте, пожалуйста, здесь. мне тоже интересно. про второй случай.
мне тут уже дали совет, но оказалось, это не то, что нужно. :(

   
 
 автор: Shorr Kan   (27.12.2005 в 15:41)   письмо автору
 
   для: elenaki   (27.12.2005 в 14:29)
 

Извините, тут не могу. Я и вам письмо послал.

   
 
 автор: cheops   (27.12.2005 в 22:26)   письмо автору
 
   для: Shorr Kan   (27.12.2005 в 15:41)
 

А да, обнаружил... я почему-то не понял, что это письмо к этой теме как-то относится, хотя там чётко об этом написано :))) Здесь следует использовать замену при помощи функции обратного вызова
<?php
  $text 
file_get_contents("index.txt");
  
$pattern "|<img src='([^\']+)'|i";
  
// $pattern = "|<a href='([^\']+)'|i";
  
$text preg_replace_callback
              
$pattern
              
"replace_text"
              
$text); 
  function 
replace_text($matches
  { 
    
// $matches[1] - это адрес
    
return "<img src='что-то'"
  } 
?>

$matches[1] в функции replace_text() - это адрес, который находится в тэге, return возвращает то, на что будет заменено найденое значение.

PS предыдущие письма несколько раз принимался читать, но ещё не очень понял, особенно с кратностью 8 - там разве под каждый товар не отводится собственный элемент?

   
 
 автор: Shorr Kan   (28.12.2005 в 07:05)   письмо автору
 
   для: cheops   (27.12.2005 в 22:26)
 

Но ведь дело-то в том, что адреса я не знаю. То есть, получается вот:


<img src='http://site.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx/FILE.jpg'
Вот что мне известно изначально. Т.е., то что будет тег img, то что в нём будет src, знак равенства, одинарная кавычка... В кавычке будет некий путь, в котором я заранее буду иметь имя домена (с протоколом), и всё... Ну еще, теоретически, имя файла будет известно. И завершающая кавычка. Вот. То есть, задача-то найти отрезок, который начинается на

<img src='http://site.com/ 
, который завершается одинарной кавычкой, и в этой строке поменять всё, что после

<img src='http://site.com/ 
, но до имени файла.

Ну и для href - аналогично. Это в первых двух случаях. В третьем - по идее, попроще. Вся строка - неважна. От

<a href='http://site.com/ 
, до одинарной кавычки - всю строчку заменить на моё...

По прошлым письмам. Да, там отдельный элемент на каждый товар. Но неизвестное количество аттрибутов и значений. Я, например, до сих пор не могу понять - почему размер там вписан значением, а вес - аттрибутом. Казалось бы - одного направления информация... Поскольку там гигантская система вложенности - каждый элемент читать на наличие VALUE или аттрибутов - то непонятно, куда это записывать. Ну вот сейчас, при том парсере, что получилось сделать - в первом товаре, в первом, открывающем теге- есть... не помню сколько, но, допустим, двадцать аттрибутов. Ладно, создаем двадцать столбцов - и пишем туда всё. Но появится у них новый товар с двадцатью двумя аттрибутами в открывающем теге? Значит надо заранее знать максимально возможное количество аттрибутов и значений - чтобы закинуть туда сотню столбцов - и пусть работает. Но! Дело-то в том, что:
а) Там нет четкого описания - какие данные могут быть, а каких может и не быть.
б) Там нет четкого количества, сколько может быть максимально.
В итоге, неясно - что и куда писать. Я сделал следующим образом - две таблицы. В первой - некоторое количество столбцов - такие данные, как название, описание, производитель... и так далее. А вторая табличка:
id | pid | stolb | znach

Айди - автоинкремент, pid - айди товара из первой таблички, stolb - имя тега , znach - его значение. И парсер, если у тега есть value, но нет аттрибутов - делает
insert into tbl2 (pid,stolb,znach) values ('$pid','$val[tag]','$val[value]')

Если же аттрибуты есть - примерно похожее, но на каждый аттрибут.

У меня и получилась первая табличка - содержит самую основную информацию, вторая таблица - сборная солянка, но зато универсальная. Вопрос в том, как ее потом использовать, но... По крайней мере, я уже сижу не на старте, а процентах на 40-60 готового проекта.
Так что пока первостепенное - тема этой... ммм... темы. Ну а вообще, конечно, сделать бы это правильно - было бы правильнее...

   
 
 автор: cheops   (28.12.2005 в 13:30)   письмо автору
 
   для: Shorr Kan   (28.12.2005 в 07:05)
 

Тут уже следует работать с функцией
<?php
  
function replace_text($matches
  { 
    
// $matches[1] - это адрес 
    
return "<img src='что-то'"
  }
?>

Например, для того, чтобы проверить входит ли в путь адрес http://site.com/ можно написать следующую реализацию
<?php
  
function replace_text($matches
  { 
    
// Экранируем точки
    
$url str_replace(".","\\.","http://site.com/");
    
// Проверяем имеется ли в начале адреса http://site.com/
    
if(preg_match("|^$url|i"$matches[1]))
    {
       echo 
"Заменяемый адрес имеет вид http://site.com/что-то";
    }
    return 
"<img src='что-то'"
  }
?>


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

   
 
 автор: Shorr Kan   (28.12.2005 в 13:56)   письмо автору
 
   для: cheops   (28.12.2005 в 13:30)
 

Откровенно говоря - не пашет. Такое впечатление, будто-бы он вообще не находит <img src='http://site.com/

А, всё понятно. Он просто не попадает в функцию replace_text ... Видимо, что такое "обратный вызов" - не понимаю не только я, но и apache...

p.s. Нет, типы товара там разделены на категории. Если в запросе передавать двоечку - то одна категория, единичку - другая. Заранее количество - неизвестно. То есть, предстоит ежедневный парсинг и обновление собственной базы.
Да ладно, вы над ней не мучайтесь. Она действительно - странноватая, эта проблема. Мало того, что я только через полтора месяца начал понимать инструкцию (всё это время ушло на обучение варианту изъяснений писавшего инструкцию), так еще она (инструкция) оказалась неполной и неверной. В итоге, я использую полностью первую таблицу, ОЧЕНЬ частично вторую... а когда надо брать информацию о конкретном товаре - хватаю ее прямо с тамошнего сайта. Вместо того, чтобы использовать собственную базу. Разумеется, самые основные данные - хранятся у меня, и по ним можно будет сделать поиск. Ну а по расширенным данным - черт с ними... Буду брать с их сайта. Собственно, именно для этого мне и нужно переделать сейчас эти ссылочки на локальные.

   
 
 автор: cheops   (29.12.2005 в 02:23)   письмо автору
 
   для: Shorr Kan   (28.12.2005 в 13:56)
 

Это я наверное с экранированием точек напортачил, попробуйте использовать следущий код
<?php 
  
function replace_text($matches
  { 
    
// Экранируем точки 
    
$url str_replace(".","\.","http://site.com/"); 
    
// Проверяем имеется ли в начале адреса http://site.com/ 
    
if(preg_match("|^$url|i"$matches[1])) 
    { 
       echo 
"Заменяемый адрес имеет вид http://site.com/что-то"
    } 
    return 
"<img src='что-то'"
  } 
?>

А лучше вообще в $url подставьте значение "http://site\.com".

PS Это похоже общая болезнь провайдеров контента - недавно авто-обновлялку делал (там правда файл менее монструозный) - дурдом какой-то, присылаются инструкции на удаление позиций которых нет, на добавление позиций, которые уже есть... Сам XML-файл 10 Мб... Система докачки парадоксальная...

   
 
 автор: Shorr Kan   (29.12.2005 в 06:23)   письмо автору
 
   для: cheops   (29.12.2005 в 02:23)
 

Warning: preg_replace_callback() requires argument 2, 'replace_text', to be a valid callback in ....

PHP Version 4.3.11
Apache/1.3.34

Код:

<?
$pattern 
"|<a href='([^\']+)'|i"
  
$text preg_replace_callback($pattern,"replace_text",$text); 
  function 
replace_text($matches){
....


Первоначально $text , разумеется - не пуст... из file_get_contents берет.

Если ставлю...
$text = preg_replace_callback($pattern,"replace_text",$text); 
...ПОСЛЕ самой функции replace_text - нет ошибки... Результат, кажется, есть. Сейчас буду разбираться. Но почему так? Я очень часто встречал, что если функция ниже, чем ее вызов - всё работает. И очень часто встречал, что нет.
==============
Назрел вопрос. Мне в функции replace_text нужна переменная $new , которую я обозначаю ВНЕ функции. Есть возможность ее как-то передать туда? Если нет - насколько допустимо использовать global $new; внутри этой функции? Просто я такой вещью (global) никогда не пользовался и не знаю - как она может себя повести.
==============
Да, и еще:
if(preg_match("|^$url|i", $matches[1])) 
    { 
       echo "Заменяемый адрес имеет вид http://site.com/что-то"; 
    } 

не работает. Прежде всего - слова "заменяемый......" не выводятся... То есть, условие if не срабатывает. Но при этом и необходимости этого я не очень понял - реально работает return, который пониже. То есть

<?
  
function replace_text($matches){
  global 
$new;
  return 
"<img src='".$new."'"
  }
//function
?>

работает полностью. Не понимаю :)
======================
И еще добавочка - там есть несколько интерфейсов. Большинство из них запрашиваются той же file_get_contents . Но есть некоторые, с примечанием "только https". Как тут действовать? Вы мне про curl говорили, но как его использовать - я не представляю. Просто:
<?<?
$ch curl_init();
curl_setopt($chCURLOPT_URL"https://www.example.com/");
curl_setopt($chCURLOPT_HEADER0);
curl_exec($ch);
curl_close($ch);
?>

? Но тогда - в чем разница? https можно было и в file_get_contents подставить...

   
 
 автор: cheops   (29.12.2005 в 13:37)   письмо автору
 
   для: Shorr Kan   (29.12.2005 в 06:23)
 

1) Да вы правильно использовали global...
2) Ошибка связана наверное с тем, что в функции обратного вызова рушится на
if(preg_match("|^$url|i", $matches[1]))

Помоему здесь вообще лучше строковыми функциями всё сделать...

   
 
 автор: Shorr Kan   (29.12.2005 в 14:16)   письмо автору
 
   для: cheops   (29.12.2005 в 13:37)
 

Да, похоже. Но тут всё работает пока. Спасибо. Пойду развивать до таких же размеров тему про curl ....

   
Rambler's Top100
вверх

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