| |
|
|
| | Есть $cod . В нем много кода, в том числе:
1. <a href='что-то' ...
2. <img src='что-то'...
3. <a href='что-то.../order.php....что-то'....
Всё надо заменить на свое. При этом, в первом и во втором - не надо затрагивать имя файла - т.е., изменить только каталоги. В третьем - не имеет значения - лишь бы на свою ссылочку. | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(27.12.2005 в 01:10)
| | | А можно реальный кусочек текста увидеть? | |
| |
|
|
| |
|
|
| |
для: cheops
(27.12.2005 в 13:02)
| | | Я вам письмом послал. | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(27.12.2005 в 14:01)
| | | ответьте, пожалуйста, здесь. мне тоже интересно. про второй случай.
мне тут уже дали совет, но оказалось, это не то, что нужно. :( | |
| |
|
|
| |
|
|
| |
для: elenaki
(27.12.2005 в 14:29)
| | | Извините, тут не могу. Я и вам письмо послал. | |
| |
|
|
| |
|
|
| |
для: 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 - там разве под каждый товар не отводится собственный элемент? | |
| |
|
|
| |
|
|
| |
для: 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 готового проекта.
Так что пока первостепенное - тема этой... ммм... темы. Ну а вообще, конечно, сделать бы это правильно - было бы правильнее... | |
| |
|
|
| |
|
|
| |
для: 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 Мда поганая задачка - а можно как-нибудь различить одни виды товара от других? Т.е. помечены тип товара каким-нибудь уникальным номером и известно ли заранее число этих типов? | |
| |
|
|
| |
|
|
| |
для: cheops
(28.12.2005 в 13:30)
| | | Откровенно говоря - не пашет. Такое впечатление, будто-бы он вообще не находит <img src='http://site.com/
А, всё понятно. Он просто не попадает в функцию replace_text ... Видимо, что такое "обратный вызов" - не понимаю не только я, но и apache...
p.s. Нет, типы товара там разделены на категории. Если в запросе передавать двоечку - то одна категория, единичку - другая. Заранее количество - неизвестно. То есть, предстоит ежедневный парсинг и обновление собственной базы.
Да ладно, вы над ней не мучайтесь. Она действительно - странноватая, эта проблема. Мало того, что я только через полтора месяца начал понимать инструкцию (всё это время ушло на обучение варианту изъяснений писавшего инструкцию), так еще она (инструкция) оказалась неполной и неверной. В итоге, я использую полностью первую таблицу, ОЧЕНЬ частично вторую... а когда надо брать информацию о конкретном товаре - хватаю ее прямо с тамошнего сайта. Вместо того, чтобы использовать собственную базу. Разумеется, самые основные данные - хранятся у меня, и по ним можно будет сделать поиск. Ну а по расширенным данным - черт с ними... Буду брать с их сайта. Собственно, именно для этого мне и нужно переделать сейчас эти ссылочки на локальные. | |
| |
|
|
| |
|
|
| |
для: 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 Мб... Система докачки парадоксальная... | |
| |
|
|
| |
|
|
| |
для: 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($ch, CURLOPT_URL, "https://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
|
? Но тогда - в чем разница? https можно было и в file_get_contents подставить... | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(29.12.2005 в 06:23)
| | | 1) Да вы правильно использовали global...
2) Ошибка связана наверное с тем, что в функции обратного вызова рушится на
if(preg_match("|^$url|i", $matches[1]))
|
Помоему здесь вообще лучше строковыми функциями всё сделать... | |
| |
|
|
| |
|
|
| |
для: cheops
(29.12.2005 в 13:37)
| | | Да, похоже. Но тут всё работает пока. Спасибо. Пойду развивать до таких же размеров тему про curl .... | |
| |
|
|
|