регулярные выражения

clevel

Новичок
регулярные выражения

на входе: некий html текст.
надо: если есть картинка, проверить src, если картинка с моего домена, то оставить, если с левого, заменить пустой строкой. вид тега такой: <IMG scr=".....">. попутно надо двой ные кавычки в src заменить на одинарные кавычки...
пытаюсь сделать так:
$short="мой домен";
$mes="<BLOCKQUOTE 0px&quot;> <HR noShade SIZE=1> <I>Написано: clevel</I><BR>test5<IMG src=\"abc.ru/tongue.gif\"><IMG src=\"abc.ru/wink.gif\"><IMG src=\"abc.ru/biggrin.gif\"> <HR noShade SIZE=1> </BLOCKQUOTE>";

$bda=array("/<IMG src=\"".$short."/img/(.*)\">/","/<IMG src=\"[^".$short."]/img/(.*)\">/");
$bdf=array("<img src='".$short."/img/\\1'>","");

echo preg_replace($bda,$bdf,$mes);
не срабатывает...
помогите с составлением правильно шаблона.... доку читал, пока мыслей нет, как поправить ситуацию...
 

.des.

Поставил пиво кому надо ;-)
callback ИМХО все остальное изврат
PHP:
$mes="SIZE=1> test53<IMG src=\"my_domain.ru/gif'><IMG src='allien.ru/gif'><IMG src=\"my_domain.ru/gif\"> <HR noShade SIZE=1> </BLOCKQUOTE>"; 

function rpl($m)
{
	//print_r($m);
	$domain="my_domain.ru";
	
	if(($pos=strpos($m[1],$domain))!==FALSE)
		$m[1]=substr($m[1],1,-1);
	else
		$m[1]="...";
	return "<IMG SRC=\"".$m[1]."\">";
}
$mes=preg_replace_callback("/<img\s+src=([\'\"].*?[\'\"])\s*>/i",'rpl',$mes);
PHP:
echo $mes;
 

clevel

Новичок
на тестовом примере все прекрасно заработало... а вот поставил в скрипт, не вызывает эту функцию для разбора src...
в чем могут быть грабли? (сэмитировал рабочую ситуацию в тестовом скрипте, все в одном файле - все работает, а вот в рабочем скрипте - блок по разбору урл - в инклуде, причем не главном)..
дока по preg_replace_callback скудная, не знаю, за что и цепляться.... почему млжет не вызываться функция rpl?
 

.des.

Поставил пиво кому надо ;-)
Отладочную печать в самой функции rpl и посмотри точно ли она не вызывается.
И схему своих инклюдов покажи.
и перед preg_replace

$arr = get_defined_functions();
print_r($arr["user"]);
 

clevel

Новичок
Array
(
[0] => rpl
)
в самой функции ставлю echo "ok"; не выводит его на эран... значения до pger_replace_callback и после $mes не изменяются :((
 

.des.

Поставил пиво кому надо ;-)
Так тестовый пример же работал!
Значит рассказывай свою схему инклюдов.
А еще покажи на какой строчке ты этот рег используешь.. ? может он просто ничего не находит соответсвенно не вызывает.
 

clevel

Новичок
схема такая:
блок, где использую данную фичу, находится вов тором уровне вложенности(include, еще раз внутри него include).
вот рабочий кусок кода:
include($path."/forum/check_image.php");
$arr = get_defined_functions();
print_r($arr["user"]);
$mes=preg_replace_callback("/<img\s+src=(['\"].*?['\"])\s*>/i",'rpl',$mes);
//echo "mes|$mes| path|$path| short|$short| m|$m|\n";
$bda=array("/\"/","/\n/","/\r+/");
$bdf=array("&quot;",""," ");
$mes=preg_replace($bda,$bdf,$mes);
 

clevel

Новичок
то есть index.php->include(path."first.lib")->include($path."second.lib").
если вынести все в отдельный файл, то работает.
не понятно, что может мешать функции?
проверял содержание $mes, include находит функцию...
 

clevel

Новичок
содержимое файла check_image.php
<?
function rpl(&$m){
global $short;
echo "ok\n";
if(($pos=strpos($m[1],$short))!==FALSE) return "<img src='".substr($m[1],1,-1)."'>";
else return '';
} //function rpl
?>
 

.des.

Поставил пиво кому надо ;-)
о и кстати убери амперсанд перед &$m он там не нужен. это моя невнимательность.
У меня работает при любом уровне вложенности инклюдов. Так что последовательно ищи баги в своем коде. И покажи наконец строку на которой ты тестируешь. Рег просто может не находить там ничего и соответсвенно не вызывать функцию.

Версия пхп какая?
 

clevel

Новичок
вот что дает echo $mes:
$mes="<BLOCKQUOTE 0px&quot;>
<HR noShade SIZE=1>
<I>Написано: clevel</I><BR>test5&nbsp;<IMG src=\"http://domen//img/forum/tongue.gif\">
<HR noShade SIZE=1>
</BLOCKQUOTE>";
apache 1.3.12 php 4.2.1 под 98
 

clevel

Новичок
сдается мне, что дело в следующем:
в тестовом примере я присваивал ручками значение переменной $mes="<BLOCKQUOTE 0px&quot;>
<HR noShade SIZE=1>
<I>Написано: moevin</I><BR>test5&nbsp;<IMG src=\"http://communicator//img/forum/tongue.gif\">
<HR noShade SIZE=1>
</BLOCKQUOTE>";
в рабочем скрипте $mes формируется путем посылки методом пост формы... может быть "->\" для рабочего варианта?
 

.des.

Поставил пиво кому надо ;-)
Ну к сожалению если ты сам не найдешь проблему то никто тебе не поможет.. рег рабочий. незначительные изменения внесешь сам ;) ты же не KAI
Могу лишь пожелать удачи :) Как решишь запости в чем трабл был, окей?
 

clevel

Новичок
пойду посплю.. а то вообще не понимаю, как в одном скрипте(один файл) может работать, а в другом - нет(инклюд файла)..
а кусок кода один и тот же, входные данные - идентичные... проверял их посредством echo $mes,...
 

clevel

Новичок
так, пошел логическим путем... проинклудил в рабочий скрипт тестовый файл вместо блока кода... таже фигня....
вставил $mes=stripslashes($mes); все заработало...
бред, но тем не менее.....
 

clevel

Новичок
таким образом, передавалось не src="что-то", a src=\"что-то\", причем \" не в значении переменной, когда присваиваем, а именно на получении, в переменной вообще черти-что... почему - не знаю... вроде просто методом посто передаю данные...
 
Сверху