2012-02-07 18 views
2

Проблема с регулярным выражениемРегулярные выражения работают разные

У меня есть код регулярного выражения, обрабатывающий графические файлы.

$view[content] = preg_replace("/(\<img)([^\>]*)(\>)/i", "\\1 name='target_resize_image[]' onclick='image_window(this)' style='cursor:pointer;' \\2 \\3", $view[content]); 

На веб-страницах, если нет «стиль„на HTML код, этот код работает отлично, Но если есть. „Стиль“, то „стиль“ код был изменен в“стиле =» курсор: указатель ;

Если у вас есть «style = '...» в img, добавлен стиль =' ... '". Если нет, код стиля должен быть «style =» cursor: pointer; ».

«preg_replace» избавляется от «style = 'aaaaaa» в коде img. Это должно быть «style =» cursor: pointer '».

входной код

<img 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" /> 

выходной код

<img style="cursor:pointer" alt="120131_12e1c8be2d6954ec9a3579ae57a64bfe_3EsTQWri2Zx9.gif" src="/data/cheditor4/1201/120131_02133169e006e1d08fc72fa5ff1e7a25_5KKOd8zrZhluXoqpiN.gif" /> 

код - должен быть

<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" /> 

Любой комментарий полезным было бы оценено.

+6

Вы знаете о таблицах стилей, не так ли? 'img {cursor: pointer; } '... проблема решена. – bummzack

ответ

4

Ваше регулярное выражение создает этот вывод:

<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" /> 
+0

DerVO/Большое спасибо за ваш добрый и подробный ответ. Я хотел бы иметь другой путь, чем синтаксический анализатор, поэтому этот код работает для запросов к записям. Если возможно, сообщите мне более простое регулярное выражение. – WindStory

+0

Я ценю ваш ценный ответ. Однако я хотел бы задать дополнительный вопрос. Я хочу насытить стиль = "и style = 'одновременно, поэтому, пожалуйста, дайте мне еще один совет для этого кода. ' $ img = str_replace (' style = "',' style =" cursor: pointer; ', $ img); // добавить информацию к данному стилю-attr' Согласно вашей инструкции, «style =» «отлично работает, однако есть« style = ». Ожидает вашего последующего ответа. – WindStory

+0

взгляните на мое второе редактирование – DerVO

Смежные вопросы