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

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

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

 

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

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

тема: Замена title и alt в теге картинки img
 
 автор: Ringo   (27.01.2011 в 09:38)   письмо автору
 
 

Добрый день!
помогите пожалуйста составить регулярное выражение.
Есть контент с тегом картинки, как в нем заменить атрибут alt и title на свой.

<?php
$new_alt_title 
''новый альт";

$content = '<a href="main.jpg" onclick="return hs.expand(this)" ><img src="thumbs_main.jpg" alt='555588888' title="555588888"  /></a>';

// что бы получилось

$content = '<a href="main.jpg" onclick="return hs.expand(this)" ><img src="thumbs_main.jpg" alt='новый альт' title='новый альт'  /></a>';

?>

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

  Ответить  
 
 автор: SHAman   (27.01.2011 в 09:58)   письмо автору
 
   для: Ringo   (27.01.2011 в 09:38)
 

s/<img(.*?)alt=(['"]).*\2(.*?)>/<img $1alt=$2новый альт$2$3>/gis
s/<img(.*?)title=(['"]).*\2(.*?)>/<img $1title=$2новый тайтл$2$3>/gis;

  Ответить  
 
 автор: Ringo   (27.01.2011 в 12:11)   письмо автору
 
   для: SHAman   (27.01.2011 в 09:58)
 

Спасибо за ответ! только а как его вставить в функцию?

я пытался вставлять так:

$title = 'новый альт';
$content = preg_replace ("s/<img(.*?)title=(['\"]).*\2(.*?)>/<img $1title=$2".$title."$2$3>/gis", $content );


но это не работает =)

  Ответить  
 
 автор: SHAman   (27.01.2011 в 14:33)   письмо автору
 
   для: Ringo   (27.01.2011 в 12:11)
 

:)
Это перловые регулярки. Для использования в php нужно разделить ее на 2 части. Для первой регулярки части будут такие:
/<img(.*?)alt=(['"]).*\2(.*?)>/si
<img $1alt=$2новый альт$2$3>

То есть, код будет такой:
$content = preg_raplace("/<img(.*?)alt=(['"]).*\2(.*?)>/si", "<img $1alt=$2новый альт$2$3>", $content);

Для второй аналогично. Разбивка идет по слешам.
В Perl запись замены выглядит так:
$text =~ s/шаблон поиска/шаблон замены/модификаторы;

символ "s" показывает что мы именно ищем и заменяем.

  Ответить  
 
 автор: Ringo   (27.01.2011 в 15:00)   письмо автору
 
   для: SHAman   (27.01.2011 в 14:33)
 

Ага понял.
Только есть баг, если альт содержит цифру вначале
то на выходе получается не то что надо.

так работает нормально:

$title = 'новый альт1';
$image = preg_replace('/<img(.*?)alt=([\'"]).*\2(.*?)>/si', "<img $1alt=$2".$title."$2$3>", $image);


а вот так уже нет:

$title = '1новый альт1';
$image = preg_replace('/<img(.*?)alt=([\'"]).*\2(.*?)>/si', "<img $1alt=$2".$title."$2$3>", $image);

на выходе получается так:

<img src="main.jpg" alt="новый" альт1="">

  Ответить  
 
 автор: SHAman   (27.01.2011 в 18:14)   письмо автору
 
   для: Ringo   (27.01.2011 в 15:00)
 

А зачем вы делаете конкатенацию?
"<img $1alt=$2".$title."$2$3>"

нужно заменить на
"<img $1alt=$2$title$2$3>"

  Ответить  
 
 автор: Ringo   (27.01.2011 в 19:28)   письмо автору
 
   для: SHAman   (27.01.2011 в 18:14)
 

А так тоже не работает. Не правильный атрибут на выходе, именно с цифрой вначале.
Похоже происходит путаница с регулярным и контеном и на выходе получается
alt="2новый" альт22="">

  Ответить  
 
 автор: dima4321   (27.01.2011 в 21:48)   письмо автору
 
   для: Ringo   (27.01.2011 в 19:28)
 

<?php
ini_set
('display_errors',1);
error_reporting(E_ALL);

$m='<a href="main.jpg" onclick="return hs.expand(this)" ><img src="thumbs_main.jpg" alt="555588888" title="555588888"  /></a>';

    
$poisk='#(alt=\").+?(\" title=\").+?(\")#si';

$zamena="$1tvoi$2drugoi$3";

$new=preg_replace($poisk,$zamena,$m);

echo 
$new;






?>

  Ответить  
 
 автор: Ringo   (28.01.2011 в 08:02)   письмо автору
 
   для: dima4321   (27.01.2011 в 21:48)
 

Спасибо за ответ!)

Но ваш пример как и предыдущий тоже с багом, если подставить цифру вначале tvoi или drugoi
то на выходе получается не правильный альт.

Но я решил эту проблему. пришлось использовать функцию при замене.


<?php
function img_alt_replace($part1$alt$part2$title$part3){
   return 
stripslashes($part1.$alt.$part2.$title.$part3);
 }

$m='<a href="main.jpg" onclick="return hs.expand(this)" ><img src="thumbs_main.jpg" alt="555588888" title="555588888"  /></a>';
$title "2новый альт22";
$new=preg_replace("#(alt=\").+?(\" title=\").+?(\")#ies""img_alt_replace('$1', '$title', '$2', '$title', '$3')"$m);
echo 
$new;
?>



Пока этот пример работает как надо, багов не обнаружено -)

  Ответить  
 
 автор: SHAman   (28.01.2011 в 16:31)   письмо автору
 
   для: Ringo   (28.01.2011 в 08:02)
 

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

  Ответить  
 
 автор: Deed   (29.01.2011 в 20:00)   письмо автору
 
   для: Ringo   (28.01.2011 в 08:02)
 


<?php
function AltTitle ($val){
$m_alt=preg_replace("/((<img.*?)alt=('|\"))(?:|.+?)(('|\")+?[^|>]+>)/is","$1NEW_ALT$4",$val);
$m_title=preg_replace("/((<img.*?)title=('|\"))(?:|.+?)(('|\")+?[^|>]+>)/is","$1NEW_TITLE$4",$m_alt);
return 
$m_title;
}
?>

  Ответить  
Rambler's Top100
вверх

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