Ваше регулярное выражение создает этот вывод:
<img name='target_resize_image[]' onclick='image_window(this)' style='cursor:pointer;' style="border-bottom: medium none; border-left: medium none; width: 160px; float: left; height: 160px; border-top: medium none; margin-right: 1em; border-right: medium none" alt="120131_12e1c8be2d6954ec9a3579ae57a64bfe_3EsTQWri2Zx9.gif" src="/data/cheditor4/1201/120131_02133169e006e1d08fc72fa5ff1e7a25_5KKOd8zrZhluXoqpiN.gif"/>
Пожалуйста, обратите внимание, что у вас есть -of курс- два атрибуты стиля в этой строке. По-видимому, вы используете какую-то HTML-проверку, которая автоматически «исправляет» это, удаляя второй, и просто оставляет вас с style='cursor:pointer;'
.
Вы можете улучшить свое регулярное выражение. Используя шаблон, такой как /(alt|style|src)=("[^"]*")/i
с preg_match_all
, вы сможете извлечь атрибуты своего тега img
, а затем обработать их и построить из него новую строку HTML.
В любом случае, Я не рекомендую манипулировать HTML, используя RegExp's. Гораздо проще и надежнее использовать инструменты DOM. Посмотрите на Simple HTML DOM Parser. Этот простой код
require 'simple_html_dom.php'; // http://simplehtmldom.sourceforge.net/
$html = str_get_html($img); // load HTML as DOM object
$img = $html->find('img', 0); // find your tag
$img->style = "cursor:pointer;".$img->style; // manipulate the style attr
$img->name="target_resize_image[]"; // set other attr's
$img->onclick="image_window(this)";
echo htmlspecialchars($html); // output HTML as string
дает выход
<img style="cursor:pointer;border-bottom: medium none; border-left: medium none; width: 160px; float: left; height: 160px; border-top: medium none; margin-right: 1em; border-right: medium none" alt="120131_12e1c8be2d6954ec9a3579ae57a64bfe_3EsTQWri2Zx9.gif" src="/data/cheditor4/1201/120131_02133169e006e1d08fc72fa5ff1e7a25_5KKOd8zrZhluXoqpiN.gif" name="target_resize_image[]" onclick="image_window(this)" />
Вуаля! И это не зависит от порядка ваших атрибутов, от используемых котировок, пробелов и разрывов строк.
EDIT: WindStory просил не-DOM Solution
Решение очень сильно зависит от данной Страницы данного вашей входной строки.Если вы, например, знаю точно, что каждый данный img
уже имеет атрибут style
, вы можете сделать это с равниной заменить:
$img = str_replace('style="', 'style="cursor:pointer; ', $img); // add info to the given style-attr
$img = str_replace('<img', '<img new_attribute="value" ', $img); // add new attrs
Имея меньше гарантий на вашем данного тега, вы можете использовать RegExp I упоминалось выше, чтобы извлечь атрибуты из тега IMG
// extract attr's, depends on double quotes
$Attrs = array();
if (preg_match_all('/(alt|style|src)="([^"]*)"/i', $img, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$Attrs[$match[1]] = $match[2];
}
}
// change/add attr's
$Attrs['style'] = empty($Attrs['style']) ? 'cursor:pointer' : 'cursor:pointer; '.$Attrs['style'];
$Attrs['name'] = 'target_resize_image[]';
$Attrs['onclick'] = 'image_window(this)';
// build new HTML
$new_img = '<img ';
foreach ($Attrs as $key => $value) $new_img .= $key.'="'.$value.'" ';
$new_img .= '/>';
в действии here.
Надеюсь, что это поможет.
EDIT 2: WindStory попросил более отказоустойчивого решения RegExp
Вот небольшая функция, чтобы добавить/изменить атрибуты в данной HTML-строке. Он поддерживает одиночные или двойные кавычки для атрибутов, но без пропущенных котировок, и это не сработает, если одна цитата заключена в двойные кавычки и наоборот.
function add_attr($html, $name, $value, $append = null) {
$attr_pattern = "/\b({$name}=['\"])([^'\"]*)(['\"])/i";
if (preg_match($attr_pattern, $html, $regs)) {
if (!is_null($append)) {
$value = $regs[2].$append.$value;
}
$replace = "\\1$value\\3";
$html = preg_replace($attr_pattern, $replace, $html);
} else {
$tag_pattern = '/<[\w]+\b/i';
$replace = "\\0 $name=\"$value\"";
$html = preg_replace($tag_pattern, $replace, $html);
}
return $html;
}
Вставьте HTML-тегов, как $html
, определить $name
атрибута и определения $value
. Если атрибут уже присутствует, значение будет заменено, иначе оно будет добавлено. Если вы установите $append
, будет добавлен $value
, а в качестве знака конкатенации будет использоваться $append
.
Это
$img = add_attr($img, 'style', 'cursor:pointer', '; ');
$img = add_attr($img, 'name', 'target_resize_image[]');
$img = add_attr($img, 'onclick', 'image_window(this)');
echo htmlspecialchars($img);
будет Outout
<img onclick="image_window(this)" name="target_resize_image[]" style="border-bottom: medium none; border-left: medium none; width: 160px; float: left; height: 160px; border-top: medium none; margin-right: 1em; border-right: medium none; cursor:pointer;" alt="120131_12e1c8be2d6954ec9a3579ae57a64bfe_3EsTQWri2Zx9.gif" src="/data/cheditor4/1201/120131_02133169e006e1d08fc72fa5ff1e7a25_5KKOd8zrZhluXoqpiN.gif" />
Вы знаете о таблицах стилей, не так ли? 'img {cursor: pointer; } '... проблема решена. – bummzack