Regex заменить атрибут html src в PHP

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

У меня есть строка вроде этого:

$string2 = "<html><body><img src = 'images/test.jpg' /><img src = 'http://test.com/images/test3.jpg'/><video controls="controls" src='../videos/movie.ogg'></video></body></html>"; 

И я хотел бы включить его в:

 $string2 = "<html><body><img src = 'test.jpg' /><img src = 'test3.jpg'/><video controls="controls" src='movie.ogg'></video></body></html>"; 

Вот что я пробовал:

 $string2 = preg_replace("/src=["']([/])(.*)?["'] /", "'src=' . convert_url('$1') . ')'" , $string2); echo htmlentities ($string2); 

В основном это ничего не меняло и дало мне предупреждение о неизменяемой строке.

Не отправляет ли $1 содержимое строки? Что здесь не так?

И функция convert_url – это пример, который я разместил здесь раньше:

 function convert_url($url) { if (preg_match('#^https?://#', $url)) { $url = parse_url($url, PHP_URL_PATH); } return basename($url); } 

Предполагается, что он вычеркивает URL-адреса и просто возвращает имя файла.

Вы должны использовать модификатор e .

 $string = "<html><body><img src='images/test.jpg' /><img src='http://test.com/images/test3.jpg'/><video controls=\"controls\" src='../videos/movie.ogg'></video></body></html>"; $string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_url("$1") . "\'"', $string); 

Обратите внимание, что при использовании модификатора e фрагмент сценария замены должен быть строкой, чтобы предотвратить ее интерпретацию перед вызовом preg_replace.

Не используйте регулярные выражения для HTML – используйте класс DOMDocument .

 $html = "<html> <body> <img src='images/test.jpg' /> <img src='http://test.com/images/test3.jpg'/> <video controls='controls' src='../videos/movie.ogg'></video> </body> </html>"; $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTML( $html ); $xpath = new DOMXPath( $dom ); libxml_clear_errors(); $doc = $dom->getElementsByTagName("html")->item(0); $src = $xpath->query(".//@src"); foreach ( $src as $s ) { $s->nodeValue = array_pop( explode( "/", $s->nodeValue ) ); } $output = $dom->saveXML( $doc ); echo $output; 

Что выводит следующее:

 <html> <body> <img src="test.jpg"> <img src="test3.jpg"> <video controls="controls" src="movie.ogg"></video> </body> </html> 
 function replace_img_src($img_tag) { $doc = new DOMDocument(); $doc->loadHTML($img_tag); $tags = $doc->getElementsByTagName('img'); foreach ($tags as $tag) { $old_src = $tag->getAttribute('src'); $new_src_url = 'website.com/assets/'.$old_src; $tag->setAttribute('src', $new_src_url); } return $doc->saveHTML(); }