如何使用PHP正则表达式查找并替换子字符串?

时间:2013-07-26 22:45:30

标签: php regex

我有一个表达式,正是这样: {gallery id ='2'}

我想从这个表达式获取id(在这个例子中为2),而不是将完整标记替换为另一个字符串。

更具体地说,我想做以下事情:

内容中的字符串:

{gallery id='2'}

使用preg_replace_callback()我想调用此函数:

function changeNumberToGalleryName( $id ){
    //get name of the gallery from database where ID = $id
    ....
    ....
    return $galleryname;
}

我想将 {gallery id ='2'} 替换为图库名称

感谢您的建议!

3 个答案:

答案 0 :(得分:2)

preg_replace("/{\s?\w+\s?id\s?=\s?'\d+'\s?}/", $gallername, $text);

答案 1 :(得分:0)

如果您不想修改您的功能,可以这样做:

$str = preg_replace_callback('~{gallery id=\'\K\d+~',
                             function ($match) {
                                 return changeNumberToGalleryName($match[0]);
                             },
                             $str);

但如果你可以修改它(即将$id替换为$id[0]在他的身体中),你可以写:

$str = preg_replace_callback('~{gallery id=\'\K\d+~',
                             'ChangeNumberToGalleryName',
                             $str);

但是你真的需要这样做的功能吗?如果图库名称是关联(或索引)数组,例如:

array(
"1" => "gallery 1 name"
"2" => "gallery 2 etc.
)

or

array('nop', 'gallery 1 name', 'gallery 2 name' ...)

你只需要使用匿名函数:

$str = preg_replace_callback('~{gallery id=\'\K\d+~',
                             function ($match) { return myarray[$match[0]]; },
                             $str);

答案 2 :(得分:0)

匹配完整标记并捕获标识符:

$re = "/{gallery id='([^']+)'}/";
preg_replace_callback($re, function($match) {
    return changeNumberToGalleryName($match[1]);
}, $string);

表达式([^']+)匹配任何内容,直到找到撇号并将找到的字符串捕获到匹配的第一个内存位置;我稍后使用$match[1]传递值。

我在这里使用回调通过内存捕获提取标识符,然后将其传递给您的函数;这样你就不必修改你的功能了。