2015-10-22 2 views
4

У меня есть исходный код с сайта, который содержит несколько тегов изображений. Я хочу использовать содержимое атрибута alt как my src. Поэтому я хочу, чтобы изменить этотRegEx: Как изменить содержимое группы

<img src="http://www.example.com/img/img.png" alt="A Title"> 

к этому:

<img src="http://www.example.org/img/a_title.png" alt="A Title"> 

Чтобы использовать значение атрибута альт в атрибуте SRC, я использую следующее регулярное выражение

/(<img.+?src=").+?(".+?alt="(.+?)">)/ 

И использовать $1$3$2 для subtitution.

Я использую PHP как язык.

Но как я могу изменить третью группу (в нижний регистр, заменить пробелы с подчеркиванием)?

+1

Какой язык вы используете? Обратите внимание, что регулярные выражения и HTML не являются хорошими друзьями. – Maroun

+0

PHP. Я использовал регулярное выражение для других манипуляций с HTML, он работал для моих случаев. – DaFunkyAlex

+1

Использовать 'preg_replace_callback' и внутри анонимной функции, получить доступ к третьей группе и сделать ее строчной буквой и выполнить другие изменения. Но вы действительно должны взглянуть на парсер HTML (PHP 'DOMDocument' с' DOMXPath' действительно классный). –

ответ

1

Это рабочую реализацию с помощью preg_match:

$input = "<img src=\"http://www.example.com/img/img.png\" alt=\"A Title\">"; 

$re = '~(<img\s*src=".*\/).*(\.[^"]*)("\s*alt="([^"]+).*)~'; 

preg_match($re, $input, $m); 

$filtered_string = $m[1] . str_replace(" ","_",strtolower($m[4])) . $m[2] . $m[3]; 

Выход:

<img src="http://www.example.com/img/a_title.png" alt="A Title"> 

Интернет реализация here.

UPDATE: реализация preg_replace_callback:

$filtered_string = preg_replace_callback(
    '~(<img.*src=".*\/).*(\.[^"]*)(".*alt="([^"]+).*)~', 
    function($m) { 
     return $m[1] . str_replace(" ","_",strtolower($m[4])) . $m[2] . $m[3]; 
    }, 
    $str 
); 

Интернет реализация второй версии here.

+0

хороший, thx, но мне больше нравится ответ hjpotter92. – DaFunkyAlex

+1

@DaFunkyAlex: проблем нет, но я думаю, что реализация hjpotter92 не работает, как вы ожидали ... –

1

Поскольку вы используете PHP, используйте preg_replace_callback:

$newLine = preg_replace_callback(
    '/(<img.+?src=").+?(".+?alt="(.+?)">)/', 
    function($matches) { 
     return $matches[1] . strtolower(str_replace(' ', '_', $matches[3])) . $matches[2]; 
    }, 
    $str 
); 
Смежные вопросы