Regexp PHP,提取id和替换

时间:2015-10-09 12:45:36

标签: php regex

我有一个带有字符串的php $variable

 '<iframe width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\" src=\"http:\/\/api.dmcloud.net\/embed\/53b5149794739966184c1a71\/548f065806361d7e915cc89e?preset=543e41ca06361d414ze777c8\"><\/iframe>'

我需要在此变量的标记src中进行一些处理。我必须使用regexp,str_replace等...

首先,我需要在src中提取第二个ID,在我的示例中它是548f065806361d7e915cc89e,之后,将所有src标记替换为其他字符串,如src = \&#34; My_New_String / ID_Extracted \&#34;

我怎么能用regexp做到这一点?还是其他?

谢谢!

编辑:我忘了指定,我在<iframe>之前和之后有更多字符串,例如:

 'XXXXXXXXXXXXX<iframe width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\" src=\"http:\/\/api.dmcloud.net\/embed\/53b5149794739966184c1a71\/548f065806361d7e915cc89e?preset=543e41ca06361d414ze777c8\"><\/iframe>XXXXXXXXXXXXXX'

4 个答案:

答案 0 :(得分:1)

您可以使用preg_replace

$html = '<iframe width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\" src="sdfsdfsdfsdf"><\/iframe>';

$newhtml =   preg_replace('/src=[^<]*<\\\/iframe>/', 'src=\"'.$mySrc.'\"></iframe>', $html);

答案 1 :(得分:1)

$iframe = '<iframe width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\" src=\"http:\/\/api.dmcloud.net\/embed\/53b5149794739966184c1a71\/548f065806361d7e915cc89e?preset=543e41ca06361d414ze777c8\"><\/iframe>';
$newIframe = preg_replace('%<iframe(.*?)src=\\\\".*?dmcloud.*?\\\\/embed\\\\/.*\\\\/(.*?)\?.*?"><\\\\/iframe>%', '<iframe $1 src=\"My_New_String/$2\"<\\\\/iframe>', $iframe);
echo $newIframe;

<强>输出:

<iframe  width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\"  src=\"My_New_String/548f065806361d7e915cc89e\"<\/iframe>

<强>样本:

http://ideone.com/SrryIc

答案 2 :(得分:1)

这应该有用..

$string = '<iframe width=\"660\" height=\"370\" frameborder=\"0\" scrolling=\"no\" src=\"http:\/\/api.dmcloud.net\/embed\/53b5149794739966184c1a71\/548f065806361d7e915cc89e?preset=543e41ca06361d414ze777c8\"><\/iframe>';
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($string);
libxml_use_internal_errors(false);
$iframes = $doc->getElementsByTagName('iframe');
foreach ($iframes as $iframe) {
    echo preg_replace('~.*/(.*?)(?:\?.*|$)~', '$1', $iframe->getAttribute('src'));
}

输出:

  

548f065806361d7e915cc89e

你的正则表达式不起作用,因为^src=\"(.)\"$

表示字符串必须以src="开头。然后捕获一个字符.。然后字符串结束($(带"。如果您向.添加了量词,例如*(前一个字符的零次或多次出现)或{ {1}}(一个或多个)并从锚点上取下它本来会更接近。你仍然不得不捏造ID。例如+,会更接近,因为它捕获了所有的东西.*src=\"(.*?)\".*属性(假设在开头和结尾只使用了双引号)。

我写的正则表达式转到最后src并捕获那里的所有内容,直到第一个/或字符串的结尾。然后它用只捕获的值(应该是id)替换字符串。更简洁的方法可能是使用preg_match,尽管你需要额外的一行来让它输出捕获的值。

?

答案 3 :(得分:1)

$test = '<iframe . . .';
$result = preg_match("/src.*\/([0-9a-f]*)\?/", $test, $out);
echo $out[1];