PHP Regex preg_replace括号

时间:2017-10-10 01:22:49

标签: php regex string replace preg-replace

我正在尝试使用正则表达式搜索字符串,替换多个值并构建URL。我从来没有使用正则表达式(从头开始),所以有点卡住了。

该字符串作为标识符包含在[方括号]中。我尝试了多种方法 - 我不明白如何构造正则表达式或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);

最终输出:

gallery / _mycode_single.php?id = 1& data = only(也删除[])

我知道这当前不起作用,因为我不知道从多行编译输出的方法;任何援助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分: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. 结尾
  3. 正则表达式中的反斜杠转义或创建元字符,\d是一个数字\t是一个标签。
  4. 如果构建网址,则不希望在返回值中使用双引号
  5. 您还需要修剪前导和尾随空格
  6. 演示:https://3v4l.org/KDD0B