2017-10-10 114 views
1

我想用正则表达式来搜索一个字符串,替换几个值并构建一个URL。我从来没有用过正则表达式(从零开始),所以有点卡住了。PHP Regex preg_replace括号之间的多个值

该字符串包含在[方括号内]作为标识符。我已经尝试了多种方法 - 我不明白如何构造正则表达式或preg_replace方法以便能够执行多个替换,理想情况下没有大量重复的正则表达式行,但是这是我尝试的方向:

$string= '[mycode="gallery" type="single" id="1" data="only"]'; //INPUT 

    $string = preg_replace('/\mycode="(.*)"\]/', '$1/mycode"', $string); 
    $string = preg_replace('/\type="(.*)"\]/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\id="(.*)"\]/', '?id=$1', $string); 
    $string = preg_replace('/\data="(.*)"\]/', '&data=$1', $string); 

最终输出:

画廊/ _mycode_single.php ID = 1个&数据=只(与删除[]太)

我知道,这是行不通目前,因为我不?知道编译多行输出的方法;任何援助将不胜感激。谢谢!

+0

对不起,是 - ]我认为我之前的努力遗留下了一个错字。我之前没有使用preg_replace_callback - 你能详细说明吗?我假设你的意思是在做其他事情之前先使用它来获取[]括号中的内容? – WWD

+0

使用下面提供的答案工作 - 再次感谢 – WWD

回答

0

你将需要去两层,首先拉动[]之间的所有内容,然后根据需要替换值。您可以使用preg_replace_callback 来完成此操作。

$string= '[mycode="gallery" type="single" id="1" data="only"]'; 
echo preg_replace_callback('/\[([^\]]+)\]/', function($match) { 
    $string = preg_replace('/\h*mycode="([^"]+)"\h*/', '$1/mycode', $match[1]); 
    $string = preg_replace('/\h*type="([^"]+)"\h*/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\h*id="([^"]+)"\h*/', '?id=$1', $string); 
    $string = preg_replace('/\h*data="([^"]+)"\h*/', '&data=$1', $string); 
    return $string; 
}, $string); 

你的正则表达式没几个原因工作:

  1. 您的字符串不与正则表达式逃逸]
  2. 反斜线结束或创建元字符,\d是一个数字\t是一个标签。
  3. 如果建立一个网址,你不希望在返回值双引号
  4. 您还需要修剪的前导和尾部空格

演示:https://3v4l.org/KDD0B

+0

非常感谢 - 您的解决方案完美无缺! – WWD